使用动态SQL

时间:2018-05-15 04:18:54

标签: oracle reference dynamic-sql bind-variables

下面的语句使用bind变量,常量和Oracle关键字的混合来插入。 ABC REVIEWN是要插入的实际值。

l_sql :='INSERT INTO EMP
         (BUSINESS_DATE,GROUP_NAME, DELETED,UPDATE_DATE) VALUES
          (:BIZ_DATE,ABC REVIEW,N,SYSDATE)';

这是使用动态SQL进行参数引用的正确方法吗?它不需要额外的括号吗?

3 个答案:

答案 0 :(得分:2)

只需在实际字符串值周围引用引号:

  l_sql :='INSERT INTO EMP
     (BUSINESS_DATE,GROUP_NAME, DELETED,UPDATE_DATE) VALUES
      (:BIZ_DATE,''ABC REVIEW'',''N'',SYSDATE)';

答案 1 :(得分:1)

  

ABC REVIEW和N是要插入的实际值。

如果你不把文字包含在' '(引号)然后Oracle将它们视为变量并期望值。在您的情况下,这会导致错误。什么@ user7294900建议绝对是正确的解决方案,但它需要高准确性,同时把引号有时会导致问题。 Oracle已经引入q'[来处理这种情况,你必须将你的语句放在q'[内,而oracle将处理引号。见下文:

l_sql :=q'[INSERT INTO EMP
         (BUSINESS_DATE,GROUP_NAME, DELETED,UPDATE_DATE) VALUES
          (:BIZ_DATE,'ABC REVIEW','N',SYSDATE)]';

http://www.oracle-developer.net/display.php?id=311

了解有关q'的更多信息

答案 2 :(得分:0)

我意识到它可以使用管道进行连接。

l_sql='INSERT INTO EMP
       (BUSINESS_DATE,GROUP_NAME,DELETED,UPDATE_DATE) VALUES
        (:BIZ_DATE,'|| 'ABC REVIEW'|| ','|| 'N'|| ',SYSDATE);