SQL脚本中的分号问题

时间:2019-06-27 17:15:57

标签: sql oracle sqlplus

我需要使用包含分号的存储过程来更新列值,这导致出现“引号字符串未正确结束”的问题。

使用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:带引号的字符串未正确结束

4 个答案:

答案 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