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