【问题标题】:insert a multiline string in Oracle with sqlplus使用 sqlplus 在 Oracle 中插入多行字符串
【发布时间】:2012-02-23 19:02:55
【问题描述】:

我有一个将长字符串插入表的 SQL 脚本。该字符串包含一个新行(并且这个新行是绝对必要的),因此当它写入文本文件时,查询被拆分为多行。比如:

insert into table(id, string) values (1, 'Line1goesHere 

Line2GoesHere 
blablablabla
');

这在 Toad 中运行正常,但是当我将其保存为 .sql 文件并使用 sqlplus 运行它时,它会将每一行视为一个单独的查询,这意味着每一行都会失败(因为 insert into table(id, string) values (1, 'Line1goesHereLine2GoesHere are' t 格式良好的脚本。

SP2-0734: unknown command beginning "Line2GoesHere" - rest of line ignored.

有没有办法解决这个问题?

【问题讨论】:

    标签: sql oracle newline sqlplus


    【解决方案1】:

    启用SQLBLANKLINES 以允许在 SQL 语句中使用空行。例如:

    SET SQLBLANKLINES ON
    insert into table(id, string) values (1, 'Line1goesHere 
    Line2GoesHere 
    
    blablablabla
    ');
    

    这个问题的前提略有错误。默认情况下,SQL*Plus 确实允许多行字符串。只有 空白 行会导致问题。

    【讨论】:

    • SQLBLANKLINES 会在下一个查询中保持“开启”状态,还是只影响当前查询?
    • 它影响整个会话 - 从连接到注销。因此,您可能需要根据需要将其设置为 OFF 或 ON。
    【解决方案2】:

    您也可以使用Oracle SQL的不知名特性:Perl style quoted strings.

    SQL> select q'[f dfgdfklgdfkjgd
      2  sdffdslkdflkgj dglk
      3  glfdglkjdgkldj ]'
      4  from dual;
    
    Q'[FDFGDFKLGDFKJGDSDFFDSLKDFLKGJDGLKGLFDGLKJDGKLDJ]'
    ----------------------------------------------------
    f dfgdfklgdfkjgd
    sdffdslkdflkgj dglk
    glfdglkjdgkldj
    

    【讨论】:

    • 这更好,因为它不是 SQL*Plus 特定的。 +1。
    【解决方案3】:

    SQL*Plus 手册

    您可以通过以下三种方式之一结束 SQL 命令:

    1. 带有分号 (;)
    2. 在一行上单独带有一个斜杠 (/)
    3. 有一个空行

    SQL 语句或脚本中的空行告诉 SQL*Plus 你有 完成输入命令,但还不想运行它。按 在命令的最后一行末尾返回。

    在这种情况下打开 SQLBLANKLINES 可能是答案,但即使使用它,您仍然需要担心以下 SQL*Plus 命令。

    @  ("at" sign)        (Start of line) 
    @@ (double "at" sign) (Start of line) 
    #   SQLPREFIX         (Start of line)
    .   BLOCKTERMINATOR   (Start of line and by itself)
    /  (slash)            (Start of line and by itself)
    ;   SQLT[ERMINATOR]   (Start of line and by itself, or at the end)
    

    SQLPREFIX 是您无法关闭的;这是 SQL*Plus 的一个特性。 BLOCKTERMINATOR 可以被激活或禁用。另一方面,如果斜杠出现在新行的开头,则会导致它执行缓冲区中的内容。 SQL[TERMINATOR] 有类似的行为。

    【讨论】:

    • 那么如何插入一个空行和以#开头的行的多行字符串?
    • 刚刚解决了,我在查询前使用set sqlprefix *,然后再设置恢复正​​常 set sqlprefix #
    【解决方案4】:

    另一种在字符串中插入换行符的方法是连接:

    chr(13)||chr(10)
    

    (在窗户上)

    或者只是:

    chr(10)
    

    (否则)

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2023-03-07
      • 2017-02-04
      相关资源
      最近更新 更多