是否可以在PL / SQL中创建一个带有结果集的SQL过程的for循环?

时间:2015-01-23 15:39:38

标签: sql oracle plsql

尝试将查询的结果(owner,object_name)提供给DBMS_STATS我尝试了以下PL / SQL片段:

DECLARE
  CCLOB  VARCHAR2(500);
  BEGIN
   FOR rec IN (
            select o.owner own,o.object_name obn
            from sys.col_group_usage$ cg,dba_objects o
             where cg.obj#=o.object_id
             group by owner,object_name
               )
   LOOP
      DBMS_OUTPUT.put_line (rec.own||' '||rec.obn);
      SELECT dbms_stats.report_col_usage(ownname =>'''rec.own''', tabname =>'''rec.obn''') into CCLOB from dual;
      DBMS_OUTPUT.PUT_LINE(CCLOB);
   END LOOP;
END;
/

但结果是:

DWI DWATOBP
ORA-20001: 'REC.OWN' is an invalid identifier

################SNPI#################

AGUN RDC
ORA-20001: 'REC.OWN' is an invalid identifier

PL/SQL procedure successfully completed.

代码的一些变体及其错误:

a)没有引号:

SELECT dbms_stats.report_col_usage(ownname =>rec.own, tabname =>rec.obn) into CCLOB from dual;

DWI DWATOBP
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 14

b)单引号:

SELECT dbms_stats.report_col_usage(ownname =>'rec.own', tabname =>'rec.obn') into CCLOB from dual;

DWI DWATOBP
ORA-20001: REC.OWN is an invalid identifier

c)有两个单引号:

SELECT dbms_stats.report_col_usage(ownname =>''rec.own'', tabname =>''rec.obn'') into CCLOB from dual;

ERROR at line 14:
ORA-06550: line 14, column 54:
PL/SQL: ORA-00907: missing right parenthesis
ORA-06550: line 14, column 7:
PL/SQL: SQL Statement ignored

1 个答案:

答案 0 :(得分:2)

将参数传递给'' '''''和'' rec.obn''',你实际上是在传递字符串:' rec.own'和' rec.obn'。这些都不是有效的标识符名称!

删除单引号,它应该有效。

ETA:另外,将变量CCLOB更改为CLOB数据类型,因为dbms_stats.report_col_usage返回CLOB。