8

在 SQL Server 中,我可以像这样定义局部变量。

declare @id number := 1000

select * from tbl_A where id = @id;
select * from tbl_B where id = @id;

非常方便。我试图做同样的事情,PL/SQL但它不起作用。

DECLARE id number;
select 1000 into id from dual;

你知道如何做类似的事情吗?最简单的方法是我的目标。

4

5 回答 5

12

如果要在 PL/SQL 中定义局部变量,则需要一个完整的 PL/SQL 块

DECLARE
  id NUMBER;
BEGIN
  SELECT 1000
    INTO id
    FROM dual;
END;

要不就

DECLARE
  id NUMBER := 1000;
BEGIN
  <<do something that uses the local variable>>
END;

如果你想在 SQL*Plus 中声明一个变量

SQL> variable id number
SQL> begin
       select 1000 into :id from dual;
     end;
     /

SQL> print id

        ID
----------
      1000

SQL> SELECT * FROM tbl_a WHERE id = :id
于 2012-07-02T17:55:54.113 回答
2

Oracle SQL 解决方案

DEF x = foo
SELECT '&x' FROM dual;

结果将是:foo

注意:该变量即使在执行后也会保留该值。清除变量运行UNDEFINE x

于 2015-04-21T15:12:07.963 回答
1

DECLARE 块的替代方法是使用 WITH 子句:

WITH my_params AS (
    SELECT 123 AS min_id FROM DUAL
) 
SELECT * 
FROM some_table 
WHERE id > (SELECT min_id FROM my_params)

由于许多供应商都支持 WITH 子句,因此它更具可移植性,并且您可以从参数无缝更改为动态值。例如:

WITH my_params AS (
    SELECT min(id) AS min_id FROM some_id_table
) 
SELECT * 
FROM some_table 
WHERE id > (SELECT min_id FROM my_params)
于 2018-03-01T12:54:31.347 回答
0

在 PL/SQL 中声明变量的一般语法是

var_nm 数据类型 [NOT NULL := var_value ];

  • var_nn 是变量的名称。
  • datatype 是有效的 PL/SQL 数据类型。
  • NOT NULL 是变量的可选规范,该变量不能被分配空值。
  • var_value 或 DEFAULT value 也是一个可选规范,您可以在其中使用某些特定值初始化变量。
  • 每个变量声明都是一个单独的语句,并且必须以分号结束。

我们可以通过以下两种方式之一为变量赋值 -

  1. 直接赋值(例如var_nm:= var_value;
  2. 使用select from(例如SELECT col_nm INTO var_nm FROM tbl_nm [WHERE clause];

在你的情况下,正如贾斯汀洞穴已经提到的那样

DECLARE 
 id number; 
BEGIN
 SELECT 1000 into id from dual;
 dbms_output.put_line('id : '|| id ); 
END; 
/

或者

DECLARE 
 id number := 1000; 
BEGIN
 dbms_output.put_line('id : '|| id ); 
END; 
/

注意:'/' 即 END 关键字后的反斜杠表示执行上述 PL/SQL 块。

于 2015-12-05T08:05:46.513 回答
0

(刚刚偶然发现这个线程。)从 SQL*Plus 12.2 开始,您可以同时声明和赋值:

SQL> var id 编号 = 1000

SQL> select * from tbl_A where id = :id;

Oracle 称之为输入绑定。

如果一定要在 PL/SQL 中做,答案是别人给出的。

于 2019-01-16T22:09:41.197 回答