【问题标题】:Getting an cursor as result when using begin and end block使用开始和结束块时获取光标作为结果
【发布时间】:2015-01-14 16:08:23
【问题描述】:

我正在尝试将多个 slq 语句的结果用于 fireac 查询编辑器中的一个结果(光标):

编辑器中的Sql命令

DECLARE
 MyVar1 varchar2(100);
 MyVar2 varchar2(100);

BEGIN
  SELECT USERINCDE INTO MyVar1 FROM P_USR WHERE USEREXCDE='PH1';
  SELECT USERINCDE INTO MyVar2 FROM P_USR WHERE USEREXCDE='PH2';
END;

SELECT MyVar1,MyVar2  AS TEST FROM DUAL

上面的代码不能作为一个 select 和 begin 和 end 块不能组合使用。 有人建议工作代码吗?

【问题讨论】:

    标签: oracle delphi delphi-xe7 firedac


    【解决方案1】:

    根据您的代码,我假设每个查询返回一个且只有一个值

    如果这是正确的,要获得所需的结果(1 行,2 列),您可以使用 CROSS JOIN

      SELECT V1.USERINCDE MyVar1, V2.USERINCDE MyVar2 FROM
        (SELECT USERINCDE FROM P_USR WHERE USEREXCDE='PH1') V1
      CROSS JOIN
        (SELECT USERINCDE FROM P_USR WHERE USEREXCDE='PH2') V2;
    

    或者只是两个子查询:

      SELECT (SELECT USERINCDE FROM P_USR WHERE USEREXCDE='PH1') MyVar1,
             (SELECT USERINCDE FROM P_USR WHERE USEREXCDE='PH2') MyVar2 FROM DUAL
    

    【讨论】:

      【解决方案2】:

      通常这是一个奇怪的愿望。如果你想从匿名块中返回一些值,你应该这样做:

      BEGIN
        SELECT USERINCDE INTO :MyVar1 FROM P_USR WHERE USEREXCDE='PH1';
        SELECT USERINCDE INTO :MyVar2 FROM P_USR WHERE USEREXCDE='PH2';
      END;
      

      但是如果你非常非常需要使用光标,你可以这样做:

      DECLARE
       MyVar1 varchar2(100);
       MyVar2 varchar2(100);
      BEGIN
        SELECT USERINCDE INTO MyVar1 FROM P_USR WHERE USEREXCDE='PH1';
        SELECT USERINCDE INTO MyVar2 FROM P_USR WHERE USEREXCDE='PH2';
        OPEN :result FOR SELECT MyVar1, MyVar2 AS TEST FROM DUAL;
      END;
      

      在最后一种情况下,结果将是ref cursor

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 2022-12-10
        • 2019-01-25
        相关资源
        最近更新 更多