1

我正在尝试编写一个脚本来帮助处理众多“此操作列表发生了什么”类型的调用,但我遇到了一些最简单的操作。

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

id 通常是 18 位数字,但偶尔会包含字母数字,因此它是 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;

每次它抛出一个错误:'在这个选择语句中需要一个 INTO 子句'。我了解 INTO 的工作原理,即如果我想将选择的结果分配给变量,但我不明白在这种情况下这将如何应用,因为我没有将查询结果分配给变量?

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

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

我也查看了各种谷歌结果,但我不知道如何在不先选择变量的情况下与变量进行比较,但正如你所看到的,我无法选择,因为我只需要它比较原因?

亲切的问候,伊恩

4

3 回答 3

3

如果您在 PL/SQL 中做某事,Raphaël Althaus 的回答适用,但我不确定这是否真的是您想要的。听起来您想要一个普通的 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;

是小型匿名 PL/SQL 块的exec简写,但除了将值分配给变量的步骤之外,它是纯 SQL,因此查询不需要包装在 abegin ... 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。

于 2013-01-18T15:47:10.143 回答
1

问题不是“您要将结果放入变量中吗”。

在 Oracle 过程的“主体”中,您不能使用SELECT没有INTO子句的 a。

(实际上你可以拥有,但在光标中)。

所以

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
于 2013-01-18T15:16:01.797 回答
0

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

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

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

于 2013-01-19T00:49:05.327 回答