在Oracle中使用select *简单使用变量

时间:2015-01-15 11:00:14

标签: oracle variables oracle-sqldeveloper

我非常了解MSSQL。但是当在Oracle中尝试SQL的一些基本内容时,我遇到了麻烦。试图搜索其他网站,但没有找到合适的+简单的例子。 假设我有如下SQL语句

Declare @mID int = 45
Select * from MyTable where id= @mID

我尝试在Oracle(SQL Developer)中编写相同的代码。但它没有奏效。

Declare 
mID number := 45
Begin
Select * from MyTable where id= mID
End;

实际上,我尝试了更多的陈述,但没有执行。我得到的只是错误。 任何人都可以想出简单的&正确的解决方案?

2 个答案:

答案 0 :(得分:1)

Oracle在SQL中没有变量,仅在PL / SQL中。与SQL Server的所有内容都是“T-SQL”不同,Oracle明确区分了SQL和(程序)PL / SQL。

SQL 语句中的变量必须由 SQL客户端完成(支持),而不是服务器。

SQL Developer支持(客户端)变量的方式与SQL * Plus相同。

define mid = 45
Select * 
from MyTable 
where id= ∣

此处记录DEFINE命令:
https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve017.htm#i2697507

(我通常不会使用SQL Developer,因此我不知道手册中是否也记录了这一点)

答案 1 :(得分:0)

你不懂SQL,你知道MS SQL:)

简单&正确的解决方案取决于你想要得到什么。您希望将记录集返回给客户吗?或者也许在下一个服务器语句中使用它?或其他什么?

MSSQL不支持(或者可能过去没有支持)查询参数,这么多年它将成为在MSSQL中进行参数化查询的方法 - 声明变量并将它们用于查询。 Oracle支持参数化查询,因此在这种情况下,您应该直接执行:

SELECT * FROM YourTable WHERE id = :id

客户端使用这种技术:

with TOraQuery.Create(nil) do
try
  SQL.Text := 'SELECT * FROM YourTable WHERE id = :id';
  ParamByName('id').AsInteger := 45;
  Open; 
  ...
  ParamByName('id').AsInteger := 46;
  Open; 
  ...
  ParamByName('id').AsInteger := 47;
  Open; 
finally
  Free;
end;

Oracle并不支持会话变量,因此类似MSSQL的方式并不适用于此。最接近Oracle的方法是

declare
  p_id YourTable.ID%type := 45;
begin
  open :result for select * from YourTable where id = p_id;
end;