【问题标题】:Oracle variable from select statement is empty value选择语句中的 Oracle 变量为空值
【发布时间】:2020-12-20 14:11:59
【问题描述】:

在 Oracle SQL 语句中,我需要从 Select 语句中分配变量值。我是按照行文档做的,但是变量值是空的。

在 SQL Server 中,我需要执行以下操作。

DECLARE @variable INT;
SELECT @variable= mycolumn from myTable;

在 Oracle 中,这里是我遇到问题的输出和查询。我正在使用 Toad 客户端。 我的目标是使用变量值作为查询的一部分。

这是一个简单的预期用途示例。

SELECT * FROM mytable WHERE DateField >= :varCurrMoDateBeg

DECLARE
   varCurrMoDateBeg DATE;
   varCurrMoDateEnd DATE;

BEGIN 

    SELECT MONTH_BEG_DATE INTO varCurrMoDateBeg FROM 
        (
        SELECT 
            CALENDAR.MONTH_BEG_DATE MONTH_BEG_DATE
        FROM 
            CALENDAR
        WHERE
            CALENDAR.CAL_TYPE='M' 
            AND (sysdate) BETWEEN CALENDAR.MONTH_BEG_DATE AND CALENDAR.MONTH_END_DATE 
        ) ;
        --DBMS_OUTPUT.PUT_LINE(varCurrMoDateBeg);
    SELECT MONTH_END_DATE INTO varCurrMoDateEnd FROM 
        (
        SELECT 
            CALENDAR.MONTH_END_DATE MONTH_END_DATE
        FROM 
            CALENDAR
        WHERE
            CALENDAR.CAL_TYPE='M' 
            AND (sysdate) BETWEEN CALENDAR.MONTH_BEG_DATE AND CALENDAR.MONTH_END_DATE 
        );
        --DBMS_OUTPUT.PUT_LINE(varCurrMoDateEnd);
    
END;

SELECT :varCurrMoDateBeg, :varCurrMoDateEnd from dual; 

在线资源:

SELECT INTO 语句 https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/13_elems045.htm

plsql - 声明一个变量并从 Oracle 中的 SELECT 查询中设置它的值 - 代码日志 Declaring a variable and setting its value from a SELECT query in Oracle

PL/SQL SELECT INTO 语句练习示例 https://www.oracletutorial.com/plsql-tutorial/plsql-select-into/

Oracle 教程 - 将查询结果分配给变量 http://dba.fyicenter.com/faq/oracle/PL-SQL-Assign-Query-Results-to-Variables.html

【问题讨论】:

  • 您没有从您提供的这些链接中得到任何答案吗?您正在使用 pl/sql 匿名块,变量的范围以 end 关键字结尾。你想用最后一个查询做什么,显然会给你空值。
  • 要使用绑定变量从匿名块中获取值,您需要使用SELECT MONTH_BEG_DATE INTO :varCurrMoDateBeg,变量名中带有冒号。这还需要在其他地方创建绑定变量(特定于工具)。如果您只想看到它有效,请在您的块中使用 DBMS_OUTPUT.PUT_LINE 来显示您的局部变量值。
  • @TadHarrison 我想在 SELECT 语句中使用变量,正如我在帖子中解释的那样——SELECT * FROM mytable WHERE DateField >= :varCurrMoDateBeg。您能否提供答案如何从匿名块中获取价值?该查询将用于在 SSRS 报告中创建数据集。
  • Using Bind Variables 在蟾蜍中
  • 相信您对T-SQL 和PL/SQL 的区别可能存在根本性的误解。在 T-SQL 中,您可以使用 T-SQL 中的选择语句返回数据集。 Oracle 不允许这样做。在 Oracle 中最接近这一点的是管道函数,虽然并不难,但管道函数需要做一些设置,并且在性能方面可能会很昂贵。即使这样,PL/SQL 也不是像 T-SQL 那样被设计为交互式的。我用过这两种语言,有时我希望 PL/SQL 像 T-SQL 一样具有解释性,但有时我很高兴它不是。

标签: sql oracle toad


【解决方案1】:

您可以为要在当前 PL/SQL 块之外使用的每个日期创建一个函数。这是一个粗略的例子来演示如何使它起作用。

CREATE OR REPLACE FUNCTION varCurrMoDateBeg

返回日期 作为 dt_工作日期; 开始 -- 将其替换为您的查询 SELECT SYSDATE INTO dt_Work FROM dual;

RETURN dt_Work;

结束 varCurrMoDateBeg; /

SELECT varCurrMoDateBeg FROM dual;

【讨论】:

    【解决方案2】:

    使用 Toad,一个小例子

    declare
    v_var date;
    v_bind date :=to_date('01.01.2020','DD.MM.YYYY');
    v_stm varchar2(4000);
    v_counter pls_integer;
    begin
    select sysdate into v_var from dual ;
    dbms_output.put_line(v_var);
    execute immediate ' select sysdate from dual ' into v_var ;
    dbms_output.put_line(v_var);
    -- with bind  
    v_stm :=  ' select count(*) from dba_objects where created > :1 '  ;
    execute immediate v_stm into  v_counter using  v_bind;
    dbms_output.put_line(v_counter);
    end;
    /
    

    当我运行这段代码时

    如您所见,这是一段非常简单的代码,展示了如何在 PL/SQL 中使用绑定变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2015-01-28
      • 2022-01-13
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多