我正在创建一个过程来处理我的 sql 脚本的错误,但声明失败。不知道是什么问题。
`
DECLARE
PROCEDURE EXEC (i_statement IN VARCHAR2, i_ignore IN NUMBER DEFAULT NULL, i_ignore2 IN NUMBER DEFAULT NULL)
IS
BEGIN
EXECUTE IMMEDIATE (i_statement);
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = i_ignore THEN NULL;
ELSIF SQLCODE = i_ignore2 THEN NULL;
ELSE
RAISE;
END IF;
END;
/
DECLARE
TYPE tt_table_name IS TABLE OF VARCHAR2(30);
--
-- List of all tables where column addition is required.
--
ct_tab_prpc_data tt_table_name := tt_table_name (
-- List of tables.
'PR_OPERATORS_BKP2',
'PR_OPERATORS_BKP3',
'PR_OPERATORS_BKP4'
);
--
v_db_name VARCHAR2(30);
v_schema_name VARCHAR2(30) := USER;
v_idx VARCHAR2(30);
BEGIN
SELECT UPPER(SYS_CONTEXT('USERENV', 'DB_NAME')) INTO v_db_name FROM DUAL;
v_idx := ct_tab_prpc_data.FIRST;
WHILE v_idx IS NOT NULL LOOP
--execute immediate 'Alter table '||ct_tab_prpc_data(v_idx)||' add(CSCLEVEL VARCHAR2(500))';
EXEC('Alter table ''||ct_tab_prpc_data(v_idx)||'' add(CSCLEVEL VARCHAR2(500))',-01430,-00942);
v_idx := ct_tab_prpc_data.NEXT(v_idx);
END LOOP;
END;
/`
错误报告 -
ORA-06550: 第 21 行,第 3 列:
PLS-00201:必须声明标识符“EXEC”
ORA-06550: 第 21 行,第 3 列:
PL/SQL:忽略语句
06550. 00000 - “第 %s 行,第 %s 列: %s”
*原因:通常是 PL/SQL 编译错误。
*行动:
是“/”和第二个
DECLARE
把它弄乱了。嵌套子程序(在匿名 pl/sql 块的声明部分中声明的 exec 过程)位于变量声明之后。
DECLARE
TYPE tt_table_name IS
TABLE OF VARCHAR2(30);
--
-- List of all tables where column addition is required.
--
ct_tab_prpc_data tt_table_name := tt_table_name(
-- List of tables.
'PR_OPERATORS_BKP2',
'PR_OPERATORS_BKP3',
'PR_OPERATORS_BKP4'
);
--
v_db_name VARCHAR2(30);
v_schema_name VARCHAR2(30) := user;
v_idx VARCHAR2(30);
PROCEDURE exec (
i_statement IN VARCHAR2
,i_ignore IN NUMBER DEFAULT NULL
,i_ignore2 IN NUMBER DEFAULT NULL
) IS
BEGIN
--EXECUTE IMMEDIATE ( i_statement );
dbms_output.put_line(i_statement);
EXCEPTION
WHEN OTHERS THEN
IF sqlcode = i_ignore THEN
NULL;
ELSIF sqlcode = i_ignore2 THEN
NULL;
ELSE
RAISE;
END IF;
END;
BEGIN
SELECT upper(
sys_context(
'USERENV'
,'DB_NAME'
)
)
INTO v_db_name
FROM dual;
v_idx := ct_tab_prpc_data.first;
WHILE v_idx IS NOT NULL LOOP
--execute immediate 'Alter table '||ct_tab_prpc_data(v_idx)||' add(CSCLEVEL VARCHAR2(500))';
exec(
'Alter table '||ct_tab_prpc_data(v_idx)||' add(CSCLEVEL VARCHAR2(500))'
,-01430
,-00942
);
v_idx := ct_tab_prpc_data.next(v_idx);
END LOOP;
END;
/
请注意,
EXEC('Alter table ''||ct_tab_prpc_data(v_idx)||'' add(CSCLEVEL VARCHAR2(500))',-01430,-00942);
中有太多引号。要么不要引用表名,要么用双引号括起来。