通过动态替换变量值来执行存储在表列中的select语句

问题描述 投票:0回答:1

我有简单的 PL/SQL 块,代码如下

declare 
rule1 varchar2(100 char);
begin
for i in (select table_name from all_tables where table_owner='EqEDI') loop
  execute immediate 'select rule_stmt from rulebook ' into rule1 ;
  execute immediate rule1 into result;
  dbms_output.put_line('Result is '||result);
end loop;
end;

表规则手册中存储的规则语句是:

"'select count(1) from '|| <tablename>"

我希望对给定所有者存在的所有表执行上述语句 但在执行时,它不会用实际表替换查询中的。 我怎样才能用简单的 PL/SQL 块来实现它。

oracle plsql
1个回答
0
投票

rulebook
表格的内容有点错误。并不是说您不能按照存储
select
语句的方式进行操作 - 这是不切实际的,因为您必须删除单引号,删除
tablename
(因为您甚至无法绑定它,而是连接光标返回的内容) ...太多不必要的工作要做。

另外,检查

all_tables
及其列名称 - 没有
table_owner
,只有
owner

因此,我建议你存储这样的语句:

SQL> SELECT * FROM rulebook;

RULE_STMT
--------------------------------------------------------------------------------
select count(*) from

修复您的 PL/SQL 脚本:

SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     rule1   VARCHAR2 (100 CHAR);
  3     l_str   VARCHAR2 (100);
  4     result  NUMBER;
  5  BEGIN
  6     FOR i IN (SELECT table_name
  7                 FROM all_tables
  8                WHERE     owner = 'SCOTT'
  9                      AND table_name = 'EMP')
 10     LOOP
 11        EXECUTE IMMEDIATE 'select rule_stmt from rulebook '
 12           INTO rule1;
 13
 14        l_str := rule1 || i.table_name;
 15
 16        EXECUTE IMMEDIATE l_str
 17           INTO result;
 18
 19        DBMS_OUTPUT.put_line ('Result is ' || result);
 20     END LOOP;
 21  END;
 22  /
Result is 14

PL/SQL procedure successfully completed.

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.