【问题标题】:How to iterate input variables using PL/SQL如何使用 PL/SQL 迭代输入变量
【发布时间】: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


【解决方案1】:

这表明严重缺乏对几个问题的理解。

  1. 由于@APC plsql(以及sql)是非交互式的。再进一步,这会导致它们都无法提示输入。您需要了解变电站变量。你永远不会直接访问数据库,你和数据库之间总是有一层软件(你的 IDE、sqlplus、sqlcl、开发语言等)。正是这一层注意到替换变量 (&...) 并提示输入它的值。此时,它会在物理上更改该行代码,在提交到数据库之前替换(因此是名称)输入的值。数据库永远不会看到带有替换变量的实际代码。
  2. “我确实想无限次地工作这个循环”。 不,你没有。。这样做只有两种终止方式。当它用完所有必要的资源时会抛出异常,无论是内存,回滚段,......如果永远不会耗尽可用资源,它将永远运行,除非被 DBA 杀死。

【讨论】:

  • 我猜 Seeker 希望循环结束的第三种方式是:在他们在 30 组提示符处输入值后按 CTRL+Q。设计崩溃始终是优质用户体验的标志!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2021-07-30
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多