当我调用以下程序时,我会得到' string literal required'例外情况,任何人都可以帮忙,我确定我以错误的形式写作(Execute Immediate):
PROCEDURE ADD_TAB_COL_COMMENT (
P_TAB_NAME IN VARCHAR,
P_COL_NAME IN VARCHAR,
P_COMMENT IN VARCHAR,
P_LEVEL IN NUMBER
)
IS
BEGIN
IF(P_LEVEL = 1)THEN
EXECUTE IMMEDIATE 'COMMENT ON TABLE ' || P_TAB_NAME || ' IS ' || P_COMMENT;
ELSIF(P_LEVEL = 2)THEN
EXECUTE IMMEDIATE 'COMMENT ON COLUMN ' || P_TAB_NAME ||'.'|| P_COL_NAME || ' IS ' || P_COMMENT;
END IF;
END ADD_TAB_COL_COMMENT ;
答案 0 :(得分:2)
您正在将P_COMMENT
中的未引用值嵌入到命令中。如果使用dbms_output
显示正在执行的命令,则执行
exec add_tab_col_comment ('T42', 'ID', 'Test', 2);
你会看到它试图这样做:
COMMENT ON COLUMN T42.ID IS Test
实际注释Test
必须用该命令的单引号括起来。在动态SQL中,您需要添加这些引号,并将其转义:
PROCEDURE ADD_TAB_COL_COMMENT (
P_TAB_NAME IN VARCHAR,
P_COL_NAME IN VARCHAR,
P_COMMENT IN VARCHAR,
P_LEVEL IN NUMBER
)
IS
BEGIN
IF(P_LEVEL = 1)THEN
EXECUTE IMMEDIATE 'COMMENT ON TABLE ' || P_TAB_NAME
|| ' IS ''' || P_COMMENT || '''';
ELSIF(P_LEVEL = 2)THEN
EXECUTE IMMEDIATE 'COMMENT ON COLUMN ' || P_TAB_NAME ||'.'|| P_COL_NAME
|| ' IS ''' || P_COMMENT|| '''';
END IF;
END ADD_TAB_COL_COMMENT ;
然后相同的调用将生成语句:
COMMENT ON COLUMN T42.ID IS 'Test'
现在有效。
每当你遇到动态SQL错误时,最简单的方法就是使用dbms_output
来显示正在执行的实际命令,如果不是那么明显问题是什么,请尝试手动运行该显示的命令。这种方法通常会很快显示缺失或不匹配的引号,缺少空格等等。