【问题标题】:How can I use external variables into EXECUTE IMMEDIATE statements in PL/SQL?如何在 PL/SQL 中将外部变量用于 EXECUTE IMMEDIATE 语句?
【发布时间】:2018-04-20 03:15:22
【问题描述】:

我需要使用 EXECUTE IMMEDIATE 命令编写一个查询,将我在嵌套查询中计算的两个值相加。我想知道我是否必须使用 USING 子句或其他子句以及如何将我创建的变量放入语句中。查询如下:

编辑:这是新查询,绑定变量仍然存在问题(Ora-01008:并非所有变量都已绑定)。你能帮我解决这个问题吗?

     EXECUTE IMMEDIATE 'SELECT sum (n_record_trovati_p) FROM (
         SELECT count(*) as n_record_trovati_p FROM od_pv_trading_day_orders partition (' || partition_current_month || ') WHERE DATETIME = :1 AND orderid = :2 AND broker = :3 
           UNION
         SELECT count(*) as n_record_trovati_p FROM od_pv_trading_day_orders partition (' || partition_previous_month || ') WHERE DATETIME = :1 AND orderid = :2 AND broker = :3 
    )' INTO n_record_trovati
    USING d_datetime, n_orderid, cur.broker;


     //old query
     sys_current_date VARCHAR2 (7);
     sys_previous_date VARCHAR2 (7);
     partition_current_month VARCHAR2 (8);
     partition_previous_month VARCHAR2 (8);

     BEGIN
     ...

     SELECT TO_CHAR(ADD_MONTHS(d_datetime,0),'yyyymm') INTO sys_current_date FROM dual;
     SELECT TO_CHAR(ADD_MONTHS(d_datetime,-1),'yyyymm') INTO sys_previous_date FROM dual;

     partition_current_month := 'P'|| sys_current_date;
     partition_previous_month := 'P'|| sys_previous_date;

     EXECUTE IMMEDIATE 'SELECT SUM (found_records) INTO ' || n_record_trovati || ' FROM (
         SELECT COUNT(*) as found_records FROM example_table PARTITION (' || partition_current_month || ') WHERE DATETIME = ' || d_datetime || ' AND orderid = ' || n_orderid || ' AND broker = ' || cur.broker || '
           UNION
         SELECT COUNT(*) as found_records FROM example_table PARTITION (' || partition_previous_month || ') WHERE DATETIME = ' || d_datetime || ' AND orderid = ' || n_orderid || ' AND broker = ' ||cur.broker || '
    )';

    ...
    end

我尝试使用 || 将变量名与执行立即字符串的其余部分分开。运算符,但弹出错误。你能告诉我我的查询有什么问题吗?我该如何解决?谢谢

【问题讨论】:

  • 错误是什么?
  • “缺少表达式”,即使没有编译错误

标签: oracle plsql execute-immediate


【解决方案1】:

您不要在字符串中使用INTO。应该是

EXECUTE IMMEDIATE 'SELECT SUM (found_records)  FROM (
         SELECT COUNT(*) as found_records FROM example_table PARTITION (' || partition_current_month || ') WHERE DATETIME = ' || d_datetime || ' AND orderid = ' || n_orderid || ' AND broker = ' || cur.broker || '
           UNION
         SELECT COUNT(*) as found_records FROM example_table PARTITION (' || partition_previous_month || ') WHERE DATETIME = ' || d_datetime || ' AND orderid = ' || n_orderid || ' AND broker = ' ||cur.broker || '
    )' INTO n_record_trovati;    

【讨论】:

  • “缺少表达式”错误消失了,现在有一个关于括号的小问题,但对我来说似乎一切正常。我是否需要以任何其他特定方式编辑字符串?无论如何感谢您的帮助,查询似乎开始起作用了!
猜你喜欢
  • 2021-04-15
  • 2021-04-15
  • 2021-12-17
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
相关资源
最近更新 更多