【发布时间】:2020-08-14 20:49:19
【问题描述】:
我正在尝试迭代“员工”表插入功能。当我尝试执行代码时,它不会多次要求输入。
这是我的代码
DECLARE
l_counter NUMBER := 0;
return_message VARCHAR2(100);
is_exit int;
--want_to_continue number;
emp_name VARCHAR2(70);--:='&f_name';
sur_name VARCHAR2(70);--:='&l_name';
dob VARCHAR2(70);--:='&birth_date';
personalid INT;--:=&per_id;
BEGIN
WHILE l_counter > -1
LOOP
emp_name :='&f_name';
sur_name :='&l_name';
dob :='&birth_date';
personalid :='&per_id';
return_message := fn_Insert_Employees(emp_name, sur_name, to_date(dob, 'YYYY-MM-DD'), personalid);
COMMIT;
l_counter := l_counter + 1;
END LOOP;
END;
执行上述代码块时发生主键冲突错误。详细的错误信息如下
错误报告 - ORA-00001: 违反唯一约束 (SYS.SYS_C007404) ORA-06512:在“SYS.FN_INSERT_EMPLOYEES”,第 12 行 ORA-06512:在第 21 行 00001. 00000 - “违反了唯一约束 (%s.%s)” *原因:UPDATE 或 INSERT 语句试图插入重复键。 对于在 DBMS MAC 模式下配置的 Trusted Oracle,您可能会看到 如果在不同级别存在重复条目,则显示此消息。 *操作:要么删除唯一限制,要么不插入密钥。
我相信上面的代码也只是在下一次迭代中重用了第一个输入值。
请帮助我迭代输入变量。
【问题讨论】:
-
PL/SQL 不是交互式语言。要么您需要以适当的方式(例如 Apex)构建 UI,要么您需要硬编码要插入脚本中的所有数据。顺便说一句,您的退出条件永远不会实现,因为它正在测试
l_counter > -1,而您的代码只会增加该计数器。 -
或者如果您可以询问要创建多少,您可以生成一个脚本; something like this 也许。
-
我确实想无限次地工作这个循环,这就是为什么使用
l_counter >-1@APC -
还有一件事:
"SYS.FN_INSERT_EMPLOYEES"。 不要使用 SYS 架构来构建您的应用程序对象。 SYS 和 SYSTEM 由 Oracle 管理。更改任一架构都可能损坏您的数据库,并可能使您的支持合同无效。以 SYSTEM 身份连接以创建一个新用户帐户,然后将该用户用于您的应用程序。
标签: sql oracle function loops plsql