gpt4 book ai didi

oracle10g - Oracle 存储过程在此 SELECT 语句中需要 INTO 子句

转载 作者:行者123 更新时间:2023-12-04 20:08:45 25 4
gpt4 key购买 nike

我有一个下面提到的存储过程。

create or replace
PROCEDURE example(
in_start_date IN VARCHAR2,
in_svc_provider IN a_message.msg_service_provider%type,sell OUT number)
IS
BEGIN SELECT COUNT(*) as sell
FROM a_message b1 WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date
AND b1.msg_trans_type = 'SELL'
AND b1.msg_service_provider = in_svc_provider;

end;

在执行存储过程时,我收到以下错误。
Error(11,1): PLS-00428: an INTO clause is expected in this SELECT statement

您能否为我提供此问题的解决方案。在 sql 中执行相同的命令时它工作正常,但在存储过程中发生编译错误,这意味着在存储过程 INTO 中替换 AS 将给出相同的输出,请澄清。

最佳答案

错误信息一目了然; PL/SQL version of a SELECT requires an INTO clause所以你的查询结果有地方去。您已经拥有 OUT将值放入的参数:

create or replace
PROCEDURE example(
in_start_date IN VARCHAR2,
in_svc_provider IN a_message.msg_service_provider%type,
sell OUT number)
IS
BEGIN
SELECT COUNT(*) INTO sell
FROM a_message b1
WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date
AND b1.msg_trans_type = 'SELL'
AND b1.msg_service_provider = in_svc_provider;
end;
SELECT现在是 INTO您的 OUT参数,并且它的值可供调用您的过程的任何人使用。

这仅适用于您的查询始终只返回一行的情况。如果它没有返回任何东西,那么你会得到一个 no-data-found 异常;如果它返回多于一行,你会得到一个太多行的异常。并且您需要为查询返回的每一列都有一个变量 - 在这种情况下只有一个。您还可以声明一个局部变量(在 ISBEGIN 之间)来保存您将在过程中操作的临时值,但在这里您也不需要它。

当你编译你的过程时,它会说它编译有警告,因为那个语法错误。如果您在 SQL*Plus 或 SQL Developer 以及其他一些工具中创建它,您可以通过发出命令 show errors 立即看到错误。 ,或随时通过查询 user_errors看法。当您调用该过程时,它无效并自动重新编译,它只是重新生成相同的错误,因为什么都没有改变;那是您看到 PLS-00428 消息的时候。在编译时查找错误比在执行时等待重新编译要好。

顺便说一句,通常最好将固定值转换为表使用的数据类型,而不是相反。当你这样做时:
  WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date

...表中的每一列都必须有它的 msg_when_created DATE值转换为字符串以与 in_start_date 进行比较字符串,这将阻止使用该列的索引。最好这样做:
  WHERE b1.msg_when_created = TO_DATE(in_start_date, 'YYYY-MM-DD')

或者如果您的列有时间组件:
  WHERE b1.msg_when_created >= TO_DATE(in_start_date, 'YYYY-MM-DD')
AND b1.msg_when_created < TO_DATE(in_start_date, 'YYYY-MM-DD') + INTERVAL '1' DAY

最好让您的调用者将值转换为 DATE所以你不必担心匹配传递的格式:
...
in_start_date IN a_message.msg_when_created%TYPE,
...
WHERE b1.msg_when_created >= TRUNC(in_start_date)
AND b1.msg_when_created < TRUNC(in_start_date) + INTERVAL '1' DAY

关于oracle10g - Oracle 存储过程在此 SELECT 语句中需要 INTO 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21531670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com