繁体   English   中英

在where子句中使用Oracle SQL变量时遇到问题

[英]Trouble using Oracle SQL variable in where clause

我正在尝试编写一个脚本来帮助解决众多“这个动作列表中发生了什么”类型的调用,但是我正在做一些砖墙做一些最简单的操作。

我正在尝试声明一个变量并在查询的where子句中使用它。 为了让这个核心功能发挥作用,我已经修剪了查询中不相关的所有内容。

id通常是一个18位数字,但偶尔会包含alpha-numerics,因此它为varchar。 我试图将它与之比较的列是一个18字节的varchar字段。

declare
  id_to_check VARCHAR(18);  

begin
  id_to_check := '549576015500000109';

select 
  txn_timestamp, exception_type
from cut.event
where irn_id = id_to_check;

end;

每次它抛出一个错误:'在这个select语句中需要一个INTO子句'。 我理解INTO是如何工作的,即如果我想将select的结果赋给变量,但是我不明白在这个实例中如何应用,因为我没有将查询的结果赋给变量?

另一个令人沮丧的事情是我实际上正在关注docs.oracle.com上的文档。

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

我也查看了各种谷歌搜索结果,但我无法弄清楚如何在没有先选择内容的情况下与变量进行比较,但正如您所看到的,我无法选择进入,因为我只需要它比较原因?

亲切的问候,伊恩

RaphaëlAlthaus的答案适用于你在PL / SQL中做的事情,但我不确定这实际上是你想要的。 听起来你想要一个简单的SQL查询,但你想能够传递一个值吗? 假设您在SQL * Plus或SQL Developer中运行它,您可以通过几种方式声明和使用固定值。 (类似的方法将在其他客户端可用; PL / SQL开发人员似乎喜欢这两种方法,至少在命令窗口中,但不确定Toad或其他任何东西)。

1)使用替换变量

define id_to_check = 549576015500000109

select txn_timestamp, exception_type
from cut.event
where irn_id = '&id_to_check';

2)使用绑定变量

variable id_to_check varchar2(18)

exec :id_to_check := '549576015500000109';

select txn_timestamp, exception_type
from cut.event
where irn_id = :id_to_check;

exec是一个小的匿名PL / SQL块的简写,但除了将值赋给变量的步骤之外,它是纯SQL,因此查询不需要包含在begin ... end ,而且你不需要“吨担心选择into变量。

在任何一种情况下,您都可以将ID值作为参数传递 ,或者在运行脚本时将其作为脚本的一部分进行请求 例如,您可以编写query.sql脚本:

define id_to_check = &1

select txn_timestamp, exception_type
from cut.event
where irn_id = '&id_to_check';

...并运行它:

sqlplus -l -s <user>/<password> @query 549576015500000109

......或者:

accept id_to_check prompt 'Enter the ID to check: '

select txn_timestamp, exception_type
from cut.event
where irn_id = '&id_to_check';

...并提示用户在运行时输入ID。

问题不是“你想把结果放到一个变量中”。

在Oracle过程的“主体”中,如果没有INTO子句,则无法使用SELECT

(事实上​​你可以拥有,但在游标中)。

所以

declare
  id_to_check VARCHAR(18);
  event_timestamp cut.event.txn_timestamp%TYPE;
  event_exception cut.event.exception_type%TYPE;

begin
  id_to_check := '549576015500000109';

select 
  txn_timestamp, exception_type
  INTO event_timestamp, event_exception
from cut.event
where irn_id = id_to_check;

end;

警告:如果未找到任何结果,则会引发NO_DATA_FOUND异常。

你可以用它来管理它

begin
  id_to_check := '549576015500000109';

  BEGIN
  select 
    txn_timestamp, exception_type
    INTO event_timestamp, event_exception
    from cut.event
    where irn_id = id_to_check;

   EXCEPTION WHEN NO_DATA_FOUND THEN 
   --...something
  END

end

你真正的问题不是关于使用变量(你是否正确),而是关于从PL / SQL块返回游标。

你似乎相信在程序结束时的一个裸选择应该以某种方式使它返回结果或至少显示它们。 虽然有些数据库的工作方式如此 - 但Oracle没有。 如果您希望任何数据留下任何类型的块(如函数或过程),则必须明确地传递它们。 通常这是通过使用游标ref类型的in参数来完成的。

正如您所看到的,没有into的select在Oracle中没有意义。 即使您设法使其工作并选择数据,您也无法访问结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM