【问题标题】:How can I store sql statements in an oracle table?如何将 sql 语句存储在 oracle 表中?
【发布时间】:2010-02-16 16:22:27
【问题描述】:

我们需要在表中存储一个选择语句

select * from table where col = 'col'

但是单引号把插入语句弄乱了。

有没有可能以某种方式做到这一点?

【问题讨论】:

  • 为什么要存储 sql 语句?
  • 存储过程和/或函数将是一个非常更好的主意。特别是如果将它们放入包中...
  • @Mitch Wheat 嗯,实际上有点复杂。我们正在从表中创建一个键值映射,并且每个键都有该 sql 列以及其他属性。 sql 列将指向包含键值的表。问题是,这个列应该是动态的,所以只要 sql 列改变,键的值就会改变。一个相当复杂的设计;是的。

标签: sql oracle select


【解决方案1】:

从 Oracle 10G 开始,有一种替代方法可以将单引号加倍:

insert into mytable (mycol) values (q'"select * from table where col = 'col'"');

我使用了双引号字符 ("),但您可以指定不同的字符,例如:

insert into mytable (mycol) values (q'@select * from table where col = 'col'@');

字面量的语法是:

q'<special character><your string><special character>'

在像这样的小例子中,它显然不是更具可读性,但它可以在大量文本中得到回报,例如

insert into mytable (mycol) values (
   q'"select empno, ename, 'Hello' message
   from emp
   where job = 'Manager'
   and name like 'K%'"'
);

【讨论】:

  • 好东西。今天学到了一些关于 10g 的新知识。
【解决方案2】:

你是如何执行插入的?如果您在前端使用任何类型的提供程序,那么它应该为您格式化字符串,这样引号就不会成为问题。

基本上,创建一个参数化查询,并将SQL语句的值赋给参数类实例,让db层为你处理。

【讨论】:

    【解决方案3】:

    您可以使用两个引号 '' 来表示一个单引号 ' 或者(对于 10g+)您也可以使用 new notation

    SQL> select ' ''foo'' ' txt from dual;
    
    TXT
    -------
     'foo'
    
    SQL> select q'$ 'bar' $' txt from dual;
    
    TXT
    -------
     'bar'
    

    【讨论】:

      【解决方案4】:

      如果您使用的是 JAVA 或 C# 等编程语言,则可以使用准备好的(参数化)语句将值放入并检索它们。

      如果您在 SQLPlus 中,您可以像这样转义撇号:

      insert into my_sql_table (sql_command) 
      values ('select * from table where col = ''col''');
      

      【讨论】:

        【解决方案5】:

        通过复制单引号进行转义:

        INSERT INTO foo (sql) VALUES ('select * from table where col = ''col''')
        

        但是,大多数数据库都提供绑定参数,因此您无需关心这些细节:

        INSERT INTO foo (sql) VALUES (:sql)
        

        ...然后你给 :sql 赋值。

        【讨论】:

          【解决方案6】:

          不要将 SQL 语句存储在数据库中!!

          在数据库中存储 SQL 视图。如果您必须使它们更清洁,请将它们放在 schema 中。如果您将 SQL 语句存储在数据库中,将不会发生任何好事,如果不记录这绝对是个坏主意。

          另外,如果您使用的是 10g,您必须这样做:做对了!根据FAQ

          Use the 10g Quoting mechanism:
          Syntax
           q'[QUOTE_CHAR]Text[QUOTE_CHAR]'
           Make sure that the QUOTE_CHAR doesnt exist in the text.
          SELECT q'{This is Orafaq's 'quoted' text field}' FROM DUAL;
          

          【讨论】:

          • sql是动态生成的。疯狂..但必要。感谢您的建议!
          • 它不是动态生成的,它是根据q'/ text /'q 语法转义的,这样/ 可以是任何字符。
          猜你喜欢
          • 1970-01-01
          • 2014-03-04
          • 2011-03-28
          • 2018-08-05
          • 1970-01-01
          • 2020-12-12
          • 1970-01-01
          • 2012-08-10
          • 1970-01-01
          相关资源
          最近更新 更多