如何在PL/SQL中像在T-SQL中那样声明和使用变量?

在Sql Server中,很多时候,当我测试存储过程的主体时,我会将主体复制到SSMS中,在页面顶部声明变量,将它们设置为一些示例值,并按原样执行主体。

例如,如果我的程序是

CREATE PROC MySampleProc
    @Name   VARCHAR(20)
AS
    SELECT @Name

那么我的测试sql将是

DECLARE @Name VARCHAR(20)
SET     @Name = 'Tom'

    SELECT @Name

与此对应的Oracle PL/SQL是什么?

这是我想到的最接近的方法,但我得到的是"PLS-00428: 在这个SELECT语句中预计有一个INTO子句"

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     select myname from DUAL;
END;

这是一个更好的例子,说明我真正想做的事情:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     SELECT *
     FROM   Customers
     WHERE  Name = myname;
END;

但同样,它想要一个'INTO',而实际上我只想把记录打印在屏幕上,而不是存储在另一个表中....。

已经解决了:

感谢@Allan,我已经让它工作得很好了。 Oracle SQL Developer显然会记住你提供的参数值。 然而,PL/SQL Developer却不希望与此有关....。

在此输入图片描述]1 !

如果你用"Run As Script",它将遵守你的默认值,但它只会以ASCI文本的形式返回结果,而不是在网格/电子表格中。

在此输入图片描述]2

解决办法

修订后的答案

如果你不是从另一个程序中调用这段代码,一个选择是跳过PL/SQL,严格使用绑定变量在SQL中完成:

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

在许多工具中(如Toad和SQL Developer),省略varexec语句会导致程序提示你输入数值。


原始答案

T-SQL和PL/SQL之间的一个很大的区别是,Oracle不允许你隐式返回查询结果。结果必须以某种方式明确返回。 最简单的方法是使用DBMS_OUTPUT(大致相当于print)来输出变量:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

然而,如果你想返回一个结果集,这就不是很有帮助了。在这种情况下,你要么想返回一个集合,要么想返回一个refcursor。然而,使用这些解决方案中的任何一种,都需要将你的代码包裹在一个函数或过程中,并从能够消耗结果的东西上运行该函数/过程。一个以这种方式工作的函数可能看起来像这样:

CREATE FUNCTION my_function (myname in varchar2)
     my_refcursor out sys_refcursor
BEGIN
     open my_refcursor for
     SELECT *
     FROM   Customers
     WHERE  Name = myname;

     return my_refcursor;
END my_function;
评论(6)

在Oracle PL/SQL中,如果你正在运行一个可能返回多条记录的查询,你需要一个游标来迭代结果。最简单的方法是使用一个for循环,例如:

declare
  myname varchar2(20) := 'tom';
begin
  for result_cursor in (select * from mytable where first_name = myname) loop
    dbms_output.put_line(result_cursor.first_name);
    dbms_output.put_line(result_cursor.other_field);
  end loop;
end;

如果你有一个精确返回一条记录的查询,那么你可以使用 "select...into... "语法,例如:

declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;
评论(0)

变量不是定义的,而是声明的。

这可能与https://stackoverflow.com/questions/8469301/declare-variables-in-a-pl-sql-block 重复。

但你可以看看这里:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#i27306

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm

更新:

参考这里 : https://stackoverflow.com/questions/2153053/how-to-return-a-resultset-cursor-from-a-oracle-pl-sql-anonymous-block-that-exe

评论(8)