存储过程命中了忽略的SQL语句

时间:2018-03-20 06:37:53

标签: oracle stored-procedures indexing concatenation sql-insert

create or replace PROCEDURE GEN_STATEMENT_SP(indexNM IN VARCHAR2, tableNM IN VARCHAR2) AS
BEGIN 
DECLARE
uniqueSTMT  VARCHAR2(30);
nonUniqueSTMT VARCHAR2(30);
charOn VARCHAR2(5);
tempfld VARCHAR2(500) ;

CURSOR chkTyp IS(SELECT ES_UNIQUENESS from sys.dba_ind_columns where INDEX_NAME = indexNM and TABLE_NAME = tableNM);
CURSOR tblColumn IS(SELECT INDEX_NAME,listagg(COLUMN_NAME, ',') WITHIN GROUP (ORDER BY COLUMN_POSITION) COLUMN_NAME FROM sys.dba_ind_columns where INDEX_NAME = indexNM and TABLE_NAME = tableNM GROUP BY INDEX_NAME);

BEGIN

uniqueSTMT := 'CREATE UNIQUE INDEX';
nonUniqueSTMT := 'CREATE INDEX';
charOn := 'on';

if chkTyp.ES_UNIQUENESS = 'UNIQUE' then

   tempfield := uniqueSTMT || indexNM || charOn || tableNM || '(' || tblColumn.COLUMN_NAME || ')' ;
   DBMS_OUTPUT.put_line(tempfld);
end if;
END;
END;
/

错误列表:

LINE/COL ERROR
-------- ------------------------------------------------------------------
9/17     PL/SQL: SQL Statement ignored
9/48     PL/SQL: ORA-00942: table or view does not exist
10/20    PL/SQL: SQL Statement ignored
10/126   PL/SQL: ORA-00942: table or view does not exist
18/1     PL/SQL: Statement ignored
18/11    PLS-00225: subprogram or cursor 'CHKTYP' reference is out of scope

大家好,当我尝试在上面创建一个示例存储过程时。我点击SQL语句被忽略了。 需要一些帮助,非常感谢。

1 个答案:

答案 0 :(得分:0)

您无权访问DBA_视图(由SYS拥有)。你真的需要那些吗?切换到USER_IND_COLUMNS。使代码生效后,进一步扩展(如有必要)。

由于CHKTYP使用不当:你声明了一个游标,但从未对它做任何事情(打开,取出,......,关闭)。另一方面,为什么使用游标?那些是返回单个值的SELECT语句(除非我错了),所以它们可能是普通的SELECTs(但是,你可能必须处理可能的NO-DATA-FOUND异常)。

此外,USER_IND_COLUMNS视图中没有列ES_UNIQUENESS;该怎么办?它存在于USER_INDEXES中,但称为UNIQUENESS,没有ES_前缀。

很快,您需要重写该代码。一步一步,经常测试。一旦确定第一步成功,请转到下一步。