我有简单的 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 块来实现它。
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>