ORA-01780: 需要字符串文字

ORA-01780: string literal required

当我调用下面的程序时,我得到 'string literal required' 异常,任何人都可以帮忙吗,我确定我正在以错误的形式编写(立即执行):

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 ;

您正在将 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 显示正在执行的实际命令,如果它不那么明显问题是什么,请尝试 运行 手动显示命令。这种方法通常会很快发现遗漏或不匹配的引号、遗漏的空格等。