【问题标题】:Query who generates insert statements : invalid number查询谁生成插入语句:无效数字
【发布时间】:2014-11-11 04:53:41
【问题描述】:

我正在尝试执行一个生成插入语句的查询,就像这样:

select 
  'insert into MYTABLE (
    ID, 
    COLUMN_A, 
    COLUMN_B)
  values (' + 
    ID + ',' +
    COLUMN_A + ',' +
    COLUMN_B  
as INSERTGENERATOR from MYTABLE;

但我有这个错误:

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    
*Action:

为什么? 我尝试使用|| 而不是+,并使用to_char,但它并没有改变。

【问题讨论】:

  • 也许你错过了结尾 ')' 和 ';' ?或者只是它们没有在示例中显示?
  • @Melon 是的,这是示例,对不起:x
  • 只需使用简单的字符串文字技术,q'[]',请参阅我在答案中的演示。

标签: sql oracle


【解决方案1】:

摆脱使用管道“||”连接字符串文字时的所有痛苦等等。只需使用最新的字符串文字功能q'[]'

SQL> SELECT q'[insert into MYTABLE (
  2  ID,
  3  COLUMN_A,
  4  COLUMN_B)
  5  values ('ID', 'COLUMN_A','COLUMN_B')]'
  6  AS INSERTGENERATOR
  7  FROM DUAL
  8  /

INSERTGENERATOR
-------------------------------------------
insert into MYTABLE (
ID,
COLUMN_A,
COLUMN_B)
values ('ID', 'COLUMN_A','COLUMN_B')

SQL>

整洁,不是吗?

【讨论】:

  • 当然IDCOLUMN_ACOLUMN_B 应该是来自MYTABLE 的值,而不是那些文字?在这种情况下,它们必须被连接起来? (虽然我一般喜欢引用的语法;只是不确定它在这里是否完全有效......)
  • 我同意。刚刚意识到这些是列名而不是文字。在这种情况下,必须连接列名。也许,当 OP 想要构建复杂的动态字符串时,他会发现新的字符串文字技术非常方便 :-) 顺便说一句,感谢您指出。
【解决方案2】:

这行得通:

SELECT
  'INSERT INTO MYTABLE 
  (ID, COLUMN_A, COLUMN_B)
   VALUES (' || 
    ID || ',' ||
    COLUMN_A || ','||
    COLUMN_B || ');'
AS INSERTGENERATOR 
FROM MYTABLE;

Sample SQL Fiddle

【讨论】:

    【解决方案3】:

    不要将行尾放在引号内。而||是用来拼接的。

    select 
      'insert into MYTABLE (ID, COLUMN_A, COLUMN_B) values (' ||
        ID || ',' ||
        COLUMN_A || ',' ||
        COLUMN_B || ');'
    as INSERTGENERATOR from MYTABLE;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 2016-03-03
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多