0

我正在运行 Oracle SQL 开发人员,并且我有以下存储过程。我对此很陌生,但真的不确定为什么这不起作用:

CREATE OR REPLACE PROCEDURE CHECKDUPLICATE(
       username1 IN USERS.USERNAME%TYPE,
       o_username OUT USERS.USERNAME%TYPE
)

IS
BEGIN

  SELECT USERNAME
  INTO o_username
  FROM USERS WHERE username1 = o_username;

END;

当我尝试调用它时:

DECLARE
   o_username USERS.USERNAME%TYPE;
BEGIN

   CHECKDUPLICATE('Jacklin', o_username);

   DBMS_OUTPUT.PUT_LINE('username :  ' || o_username);

END;

我收到错误消息:

Error starting at line 1 in command:
DECLARE
   o_username USERS.USERNAME%TYPE;
BEGIN

   CHECKDUPLICATE(Jacklin, o_username);

   DBMS_OUTPUT.PUT_LINE('username :  ' || o_username);

END;
Error report:
ORA-06550: line 5, column 19:
PLS-00201: identifier 'JACKLIN' must be declared
ORA-06550: line 5, column 4:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

“必须声明标识符'Jacklin'是什么意思?(表称为USERS,列名称为USERNAME)。任何帮助将不胜感激。

编辑**我把杰克林放在引号里,我现在收到这条消息:

Error report:
ORA-01403: no data found
ORA-06512: at "L13JAV04.CHECKDUPLICATE", line 9
ORA-06512: at line 6
01403. 00000 -  "no data found"
*Cause:    
*Action:

尽管 Jacklin 确实存在于数据库中!

4

3 回答 3

3

一旦您引用 'Jacklin' 以便将其视为字符串文字而不是标识符,您的 SQL 语句看起来就不正确了。

  SELECT USERNAME
  INTO o_username
  FROM USERS 
  WHERE username1 = o_username;

我的赌注是您想在WHERE子句中使用输入参数,而不是输出参数。

  SELECT USERNAME
  INTO o_username
  FROM USERS 
  WHERE username1 = username;

当您没有做任何初始化操作时,检查输出参数的值是没有意义的。

但是您的代码似乎仍然没有意义。如果返回 1 行以外的任何内容, ASELECT INTO将引发错误。如果您的查询返回 0 行,则会出现NO_DATA_FOUND异常。如果您的查询返回超过 1 行,您将收到TOO_MANY_ROWS异常。您的过程已命名CheckDuplicate,因此我猜它的目的是检查表中是否已存在特定用户名,而不是尝试插入它并捕获唯一约束违规错误。如果这是您的代码的意图

  • 您可能希望它成为一个函数
  • 您可能不想退回username
  • 您可能希望返回用户名是否已存在的指示符

因此,我的猜测是你会想要类似的东西

create or replace function isAvailable( p_username IN USERS.USERNAME%TYPE )
  return Boolean
is
  l_username USERS.USERNAME%TYPE;
begin
  select username
    into l_username
    from users
   where username = p_username;
  return false;
exception
  when no_data_found
  then
    return true;
end;
于 2013-07-31T15:52:42.010 回答
1

您需要将 Jacklin 放在引号内,以便将其视为字符串。否则解析器认为它是一个字段名。

于 2013-07-31T15:28:21.570 回答
0

将没有名为“Jacklin”的用户,这就是它给你错误的原因。请在最后添加一个例外

WHEN NO_DATA_FOUND 
THEN
......
于 2013-07-31T15:50:27.083 回答