我需要使用包含分号的存储过程来更新列值,这导致出现“引号字符串未正确结束”的问题。
使用Putty连接到服务器并使用SQL Plus执行命令
试图使用/;但这没用
update dummy_table
set
col1 = 0, col2 = null, col3 = to_clob(
'declare
source_table varchar2(40) := :par1;
target_table_name varchar2(40) := :par2;
'||'
begin '||'
select * from temp_table;
end;
'||'/'
), col4 = null
where col5 = 'value_1' and col6 = 'value_7';
ER:命令应成功执行,并应使用给定值更新col3
AR:带引号的字符串未正确结束
答案 0 :(得分:1)
分号告诉SQLPlus您想运行您所键入的命令。看起来您似乎并没有在引号中间的字符串。 要停止此操作,请将整个命令放在其自己的块中,在该块中将将分号视为该块的一部分,而不尝试执行到目前为止输入的内容。块由BEGIN和END关键字包围。告诉SQLPlus,您可以通过在一行上输入一个句点来完成操作,然后通过输入一个斜杠来运行该块。
因此,如果您输入的是SQL * Plus,它将看起来像这样:
BEGIN
update dummy_table
set
col1 = 0, col2 = null, col3 = to_clob(
'declare
source_table varchar2(40) := :par1;
target_table_name varchar2(40) := :par2;
'||'
begin '||'
select * from temp_table;
end;
'||'/'
), col4 = null
where col5 = 'value_1' and col6 = 'value_7';
END;
.
/
答案 1 :(得分:0)
您可以使用以下解决方案中提到的Oracle替代报价机制技术:
UPDATE DUMMY_TABLE
SET
COL1 = 0,
COL2 = NULL,
COL3 = TO_CLOB('declare
source_table varchar2(40) := :par1;
target_table_name varchar2(40) := :par2;
'
|| '
begin '
|| '
select * from temp_table;
end;
'
|| q'#/#'),
COL4 = NULL
WHERE
COL5 = 'value_1'
AND COL6 = 'value_7';
字符串,其中包含任何特殊的oracle保留字符,如果要将其视为字符串,则需要使用带引号的字符串:q'<Special symbol><Your string><Special symbol>'
。
请参考Oracle文档中的Oracle Alternative Quoting Mechanism技术。
答案 2 :(得分:0)
SQLPlus似乎不喜欢行尾的分号,无论它们是否是带引号的字符串的一部分。这行得通,与您的陈述相同,但增加了换行符(CR + LF):
update dummy_table
set
col1 = 0, col2 = null, col3 = to_clob(
'declare
source_table varchar2(40) := :par1;' || chr(10) || chr(13) ||'
target_table_name varchar2(40) := :par2;' || chr(10) || chr(13) ||'
'||'
begin '||'
select * from temp_table;' || chr(10) || chr(13) ||'
end;' || chr(10) || chr(13) ||'
'||'/'
), col4 = null
where col5 = 'value_1' and col6 = 'value_7';
答案 3 :(得分:0)
set sqlterminator off
update dummy_table
set
col1 = 0, col2 = null, col3 = to_clob(
'declare
source_table varchar2(40) := :par1;
target_table_name varchar2(40) := :par2;
'||'
begin '||'
select * from temp_table;
end;
'||'/'
), col4 = null
where col5 = 'value_1' and col6 = 'value_7'
/
set sqlterminator on