【问题标题】:PL/SQL Storing row into a variable and using them in for loopPL/SQL 将行存储到变量中并在 for 循环中使用它们
【发布时间】:2014-10-26 14:46:22
【问题描述】:

我正在编写脚本,在将行值保存到变量时出错 我正在尝试更新需要从其他相应表中获取的表

DECLARE
cur SYS_REFCURSOR;
dept_row department%rowtype;
employee_row employee%rowtype;
status number :=0;
BEGIN

FOR employee_details IN (select * from employee_details_table)
LOOP
select * into dept_row from department dept where employee_details.dept_id = dept.dept_id;
select * into employee_row from employee emp where emp.dept_id = empoyee_details.dept_id;

IF employee_details.valid <> employee_row.valid THEN
 // call SP which uses values from both dept_row & employee_row
END IF;
END LOOP;
COMMIT;
END;
/

当我运行上述 SQL 时,我遇到了错误。 ORA-01722 ORA-06512

我无法弄清楚上面的代码有什么问题。 请帮忙

谢谢

【问题讨论】:

  • 您错误地使用了collection。此外,最好避免使用 for 的循环,并使用批量收集和 forall 语句来最小化 sql 和 plsql 引擎之间的上下文切换的开销。检查我的答案。

标签: database oracle loops plsql cursor


【解决方案1】:

您错误地使用了collection。另外,最好避免使用for 使用loop 并使用bulk collectforall statement 以最小化context switchsql and plsql engines 之间的开销。

宣布 类型 t_bulk_collect_test_tab 是员工表%ROWTYPE 的表; l_tab t_bulk_collect_test_tab; CURSOR c_data 是 选择 * 从员工表; 开始 打开 c_data; 环形 获取 c_data BULK COLLECT INTO l_tab LIMIT 10000; 当 l_tab.count = 0 时退出; ………… 结尾;

更多关于collections、bulk collect和forall语句的例子,请参考这里的例子http://oracle-base.com/articles/9i/bulk-binds-and-record-processing-9i.php

记住,最好避开loopsRow by rowslow by slow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多