我创建了一个具有某些属性的表Patient,例如p_name,p_surname,p_number...。我想创建一个过程以将患者从该表Patient转移到另一个表(Patient_backup),以防他的“ p_number”属性已收到输入,将其从第一个表中删除,仅保留在第二个表中。第二个表具有与第一个表相同的结构。我已经对程序进行了编码。
CREATE TABLE patient ( p_number VARCHAR2(10) NOT NULL, p_name VARCHAR2(15), p_surname VARCHAR2(15), p_street VARCHAR2(20), p_city VARCHAR2(15) ); CREATE TABLE patient_backup ( p_number VARCHAR2(10) NOT NULL, p_name VARCHAR2(15), p_surname VARCHAR2(15), p_street VARCHAR2(20), p_city VARCHAR2(15) ); CREATE [OR REPLACE] PROCEDURE transfer (p_number VARCHAR2) AS CURSOR k1 IS SELECT p_number FROM patient; BEGIN OPEN k1; LOOP FETCH k1 INTO p_number; IF p_number IS NULL THEN dbms_output.put_line('empty'); ELSE INSERT INTO patient_backup (SELECT * FROM patient); Execute Immediate 'Drop Table patient;'; END IF; END LOOP; CLOSE k1; END transfer;
但是当我运行它时,出现错误“ ORA-00922:缺少或无效的选项”。你能帮我吗?我想知道代码是否正确。我已经阅读了有关PL / SQL的材料,但是这些概念没有相互关联,因此我只是尝试将所有内容收集在一起,并且希望它是正确的。您能帮我纠正此代码并使它生效吗?
很难确定错误的确切位置,但我的猜测是:;
从中删除字符串中的execute immediate
。
不过,我想你想你不想要DROP
的表-从数据库中包括完全删除表中的所有行和它的定义。此后将无法访问。
我认为您真正想要的是DELETE
从该表中移出一行,而不是完全删除该表。
另外:整个循环完全没有必要(而且效率很低)。您可以使用两个简单的SQL语句来做到这一点:
insert into patient_backup select * from patient where p_number = 42; --<< to pick one patient delete from patient where p_number = 42;
将其放入过程中:
CREATE PROCEDURE transfer (p_number_to_delete VARCHAR2) AS BEGIN insert into patient_backup select * from patient where p_number = p_number_to_delete; delete from patient where p_number = p_number_to_delete; END transfer;
强烈建议不要将列名用作参数名。这就是为什么我给参数命名的原因p_number_to_delete
(但是p_number
对于以数字开头的列来说,它是一个不好的名字-但这是另一种讨论)