我需要编写一个带有嵌入式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技巧可以帮助我实现同样的目标。重复一长串表格十几次会使代码看起来很糟糕。这说我的剧本是一个"一个关闭"所以也许我担心太多了。仍然有专业人士"如何"好奇心。但
提前感谢您的意见。
答案 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 sqlString
,FETCH cursor INTO...
,和CLOSE cursor
语句,或额外的业力和一堆困难研究DBMS_SQL包 - 并且可能C͡͏ţ͘húl͞ḩ̸u҉͝怜悯你的灵魂。
祝你好运。