ORA-01780:需要字符串文字

时间:2016-02-01 09:34:16

标签: oracle stored-procedures invoke execute

当我调用以下程序时,我会得到' 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 ;

1 个答案:

答案 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来显示正在执行的实际命令,如果不是那么明显问题是什么,请尝试手动运行该显示的命令。这种方法通常会很快显示缺失或不匹配的引号,缺少空格等等。