运行 SQL 在 Oracle 过程中查询时出错

Getting error while running SQL query in Procedure in Oracle

尝试创建一个接受输入并执行 Select 查询的简单过程,如下所示:

CREATE OR REPLACE PROCEDURE test3(br IN VARCHAR2)
AS
    a varchar(32);
BEGIN
    SELECT * FROM BRANDS B WHERE B.BRAND_ID = br  INTO a;
    dbms_output.put_line(a);
END;

我收到以下错误:

Errors: PROCEDURE TEST3
Line/Col: 5/1 PL/SQL: SQL Statement ignored
Line/Col: 5/47 PL/SQL: ORA-00933: SQL command not properly ended

Table 是:

BRAND_ID NAME ADDRESS JOIN_DATE PASSWORD
Brand01 Brand X 503 Rolling Creek Dr Austin, AR 04/01/2021 12345abcde
Brand02 Brand Y 939 Orange Ave Coronado, CA 03/25/2021 12345abcde
Brand03 Brand Z 20 Roszel Rd Princeton, NJ 05/08/2021 12345abcde
  • 您需要 FROM 之前的 INTO 子句。
  • 您需要一个带有 SELECT *%ROWTYPE 变量。
  • 根据上一点,您不能在记录上使用 DBMS_OUTPUT.PUT_LINE();您需要提取各个字段。
  • 您应该处理 NO_DATA_FOUND 异常。
  • 不要将密码存储为纯文本。存储密码的单向哈希值。

给出:

CREATE OR REPLACE PROCEDURE test3(
  br IN BRANDS.BRAND_ID%TYPE
)
AS
  a BRANDS%ROWTYPE;
BEGIN
  SELECT *
  INTO   a
  FROM   BRANDS
  WHERE  BRAND_ID = br;
  
  dbms_output.put_line(
    a.brand_id
    || ' ' || a.name
    || ' ' || a.address
    || ' ' || a.join_date
    || ' ' || a.password
  );
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    NULL;
END;
/

然后:

BEGIN
  test3('Brand02');
END;
/

输出:

Brand02 Brand Y 939 Orange Ave Coronado, CA 25-MAR-21 12345abcde

db<>fiddle here