如何在 PL/SQL 中声明和设置变量

Bob*_*yer 3 oracle plsql

问题

我正在努力在 PL/SQL 中定义变量

在 T-SQL 中,很容易声明和设置变量并在 Select 查询中引用它们(如下所示)。但是我该如何在 PL/SQL 中做类似的事情呢?

我尝试过什么

这似乎是 Stack 上多次被问到的常见问题,但没有明确的答案!我得到的最接近的是这里链接,但即使如此我也无法让它为我工作。

我的各种 PL/SQL 尝试

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';
     dbms_output.print_line(myname);
END;

variable v_date datetime;
exec :v_date := to_date('01/01/2014','mm/dd/yyyy');

var myname varchar2(20);
exec :myname := 'Tom';
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的事情的 T-SQL 示例

DECLARE 
    @String VARCHAR(10),
    @Date DATE,
    @Integer As INT

SET @String = 'Hello'
SET @Date = '20200413'
SET @Integer = Year(@Date)

SELECT *
FROM TABLE
WHERE 1=1
AND col_a = @String
AND col_b >= @Year
Run Code Online (Sandbox Code Playgroud)

MT0*_*MT0 5

SQL/Plus 和 SQL 开发人员

如果您使用的用户界面支持该VARIABLE命令,那么您可以使用它来声明绑定变量:

VARIABLE string VARCHAR2(10);
VARIABLE dt     DATE;
VARIABLE year   NUMBER;

BEGIN
  :string := 'Hello';
  :dt := DATE '2020-04-13';
  :year := EXTRACT( YEAR FROM :dt );
END;
/

SELECT *
FROM   table_name
WHERE  col_a = :string
AND    col_b = :year;
Run Code Online (Sandbox Code Playgroud)

然而,这里除了中间部分之外,您没有使用 PL/SQL BEGIN ... END

其他用户界面

您可以声明单个 PL/SQL 块并使用 PL/SQL 变量:

DECLARE
  v_string VARCHAR2(10) := 'Hello';
  v_dt     DATE         := DATE '2020-04-13';
  v_year   NUMBER(4,0)  := EXTRACT( YEAR FROM v_dt );
  c_cur    SYS_REFCURSOR;
BEGIN
  OPEN c_cur FOR
    SELECT *
    FROM   table_name
    WHERE  col_a = v_string
    AND    col_b = v_year;

  -- Do stuff in PL/SQL with the cursor.
END;
/
Run Code Online (Sandbox Code Playgroud)