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语句被忽略了。 需要一些帮助,非常感谢。
答案 0 :(得分:0)
您无权访问DBA_视图(由SYS拥有)。你真的需要那些吗?切换到USER_IND_COLUMNS
。使代码生效后,进一步扩展(如有必要)。
由于CHKTYP使用不当:你声明了一个游标,但从未对它做任何事情(打开,取出,......,关闭)。另一方面,为什么使用游标?那些是返回单个值的SELECT
语句(除非我错了),所以它们可能是普通的SELECTs
(但是,你可能必须处理可能的NO-DATA-FOUND
异常)。
此外,USER_IND_COLUMNS
视图中没有列ES_UNIQUENESS;该怎么办?它存在于USER_INDEXES
中,但称为UNIQUENESS
,没有ES_前缀。
很快,您需要重写该代码。一步一步,经常测试。一旦确定第一步成功,请转到下一步。