Oracle多个游标具有相同的" WHERE"条款

时间:2015-09-24 02:38:37

标签: oracle plsql

我需要编写一个带有嵌入式PL / SQL的脚本,它会打开一些游标并循环读取执行某些操作的记录。

所有游标都有 WHERE 的部分内容,如下所示:AND table_name IN ('table_one', 'table_two' ... 'last_table_from_a_long_list')

因为在任何地方使用相同的表列表,我宁愿不重复自己,而是在某处声明表的列表并在每个游标定义中重用它。理想情况下,您可以将这些表名放在一个真实的表中,一切都可以正常工作;但是,该脚本将在生产中运行,并且为此目的创建/删除表不是公认的做法。关于创建用户定义类型table_name而另一个类型为TABLE OF table_name,同样的限制适用。

只是想知道是否有一些PL / SQL技巧可以帮助我实现同样的目标。重复一长串表格十几次会使代码看起来很糟糕。这说我的剧本是一个"一个关闭"所以也许我担心太多了。仍然有专业人士"如何"好奇心。但

提前感谢您的意见。

2 个答案:

答案 0 :(得分:0)

您可以尝试多种选择

立即执行

- 光标示例

sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;

另一个选项是 DBMS_SQL

CREATE OR REPLACE PROCEDURE DYNSQL AS
  cur integer;
  rc  integer;
BEGIN
  cur := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(cur, 'CREATE TABLE X (Y DATE)', DBMS_SQL.NATIVE);
  rc := DBMS_SQL.EXECUTE(cur);
  DBMS_SQL.CLOSE_CURSOR(cur);
END;

你可以使用这些关键词进行谷歌搜索,你会发现很多例子。

答案 1 :(得分:0)

简短回答:重复代码。

更长的答案:不重复代码不仅仅是咬住子弹并处理一些不那么完美的代码。

最长的答案:如果你真的需要坚持这样做,那么考虑使用动态创建的SQL - 用字符串构建你的SELECT语句,然后使用OPEN cursor FOR sqlStringFETCH cursor INTO... ,和CLOSE cursor语句,或额外的业力和一堆困难研究DBMS_SQL包 - 并且可能C͡͏ţ͘húl͞ḩ̸u҉͝怜悯你的灵魂。

祝你好运。