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

Sql server 如何像在T-SQL中一样在PL/SQL中声明和使用变量?,sql-server,oracle,tsql,plsql,oracle-sqldeveloper,Sql Server,Oracle,Tsql,Plsql,Oracle Sqldeveloper,在Sql Server中,通常在测试存储过程主体时,我会将主体复制到SSM中,在页面顶部声明变量,将它们设置为一些示例值,然后按原样执行主体 例如,如果我的进程是 CREATE PROC MySampleProc @Name VARCHAR(20) AS SELECT @Name 那么我的测试sql将是 DECLARE @Name VARCHAR(20) SET @Name = 'Tom' SELECT @Name Oracle PL/SQL与此等效的是

在Sql Server中,通常在测试存储过程主体时,我会将主体复制到SSM中,在页面顶部声明变量,将它们设置为一些示例值,然后按原样执行主体

例如,如果我的进程是

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 *
     FROM   Customers
     WHERE  Name = myname;
END;
但同样,它需要一个“输入”,而实际上我只希望记录打印在屏幕上,而不是存储在另一个表中

决议:

多亏了@Allan,我的工作已经足够好了。Oracle SQL Developer显然记住了您提供给它的参数值。然而,PL/SQL开发人员不希望与此相关

如果您“以脚本方式运行”,它将遵守您的默认设置,但它将仅以ASCI文本的形式返回结果,而不是以网格/电子表格的形式返回结果


变量未定义,但已声明

这可能是重复的

但你可以看看这里:

更新:


请参阅此处:

修改后的答案

如果您不是从另一个程序调用此代码,可以选择跳过PL/SQL,并使用绑定变量在SQL中严格执行此操作:

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;
在许多工具中(如Toad和sqldeveloper),省略
var
exec
语句将导致程序提示您输入值


原始答案

T-SQL和PL/SQL之间的一大区别是Oracle不允许隐式返回查询结果。结果总是必须以某种方式显式返回。最简单的方法是使用
DBMS\u 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;

在OraclePL/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;

这是我找到的最接近我的答案的一个,但是它们没有显示如何在查询的select列表中使用变量,这会不断给我带来错误。最后一段代码中有两个问题。1) 变量前面不需要冒号,赋值语句和SELECT语句都不需要冒号。2) SELECT语句的结果需要转到某个地方,例如,您声明了第二个变量,并将
SELECT Name从DUAL
写入Name2。如果我不希望结果转到某个地方,我只希望它们显示在PL/SQL Developer的网格中,那是不可能的(除非您使用了相当高级的功能)。T-SQL和PL/SQL在这方面有很大的不同。如果您想测试一个存储过程,那么您可能想使用DBMS_OUTPUT.PRINT_LINE来编写结果,这种方式大多数Oracle工具(如TOAD、SQL Developer、PL/SQL Developer)都可以捕获并显示结果。我过去也一直在努力解决这个问题。您必须使用select into并使用dbms_output.put_line(myname)打印输出;Oracle使用游标返回结果,SQL Server不使用。也许我问的问题不对。根据您的链接,我知道如何分配值,但如何将其选中并在结果集中显示?您所说的在结果集中显示是什么意思?你想选择value作为函数吗?用一个更好的例子更新了问题的结尾,说明了我试图做什么/回答了你的后续问题。然后你需要创建函数而不是过程,并从DUAL中选择MY_FUNC();函数可以返回结果集。看看我的updateAh,看看我不想要可重用的代码,这就是我的观点。我想知道如何在现在只是一个1运行的PL/SQL开发人员窗口中,使用静态定义/分配的变量,重新使用过程(和参数)的主体。我将如何在PL/SQLDeveloper中运行它?如果我使用这种语法,我会在var行中得到“invalidsqlstatement”?还是我只需要使用Toad?我最初在
exec
语句中留下了一个冒号。对于冒号,如果“运行脚本”,它应该在SQLDeveloper中工作,但结果将输出到脚本输出窗格,而不是查询结果网格。考虑到有限的实验,我发现让它进入网格的唯一方法是省略
var
exec
语句,让SQL Developer提示您输入一个值。我一直得到“ORA-01008:并非所有变量都绑定”。我应该将其作为“SQL窗口”或“测试窗口”或其他窗口运行吗?您使用的到底是什么工具?我的印象是您使用的是Oracle的免费SQL Developer,但这与您最后的评论不符。我使用的是PL/SQL Developer,而不是Oracle Developer。刚刚安装了它,它会提示输入参数,就像您描述的那样。我仍然想知道如何使用脚本定义的密码,但这已经足够好了。
declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;