【问题标题】:Oracle/PL-SQl:Pass on query result to another updateOracle/PL-SQl:将查询结果传递给另一个更新
【发布时间】:2021-02-04 21:26:45
【问题描述】:

您好,我正在尝试使用基于一个查询结果的 PL/SQL 进行更新,存储结果并将此结果发送到更新查询但得到

ORA-06550: line 2, column 24: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: := ( ; not null range default character

表:

    create table person(id number(10),stat char(1));
    insert into person(id,stat)values(123,'Y');
    insert into person(id,stat)values(123,'Y');
    insert into person(id,stat)values(345,'Y');
    commit;

查询:

DECLARE
  deptid  person.id%TYPE;
BEGIN
  SELECT id INTO deptid 
     FROM person WHERE id = 345;
  IF SQL%FOUND THEN 
    Update person set stat='N' where id=deptid;
    commit;
    DBMS_OUTPUT.PUT_LINE('Dept Id: ' || deptid ||);
  END IF;
END;
/

我在这里做错了什么?

【问题讨论】:

  • 为什么不把整个事情包装成一个查询呢?
  • 我需要从选择返回的结果。我必须将其传递给其他插入状态。不能这样更新吗?
  • 我不明白select 查询的逻辑。它所能返回的只是一个或几行保存值345,您已经将其作为文字值提供给where 子句。然后您使用该信息更新同一张表。为了使问题有意义,您可能需要展示一个更有意义的用例。
  • 我只是举一个例子,我的第一个查询实际上返回 345 我将从一个查询中获取 id,我需要在多个更新和插入语句中使用它。只是试图保持问题尽可能小尽可能

标签: sql oracle plsql oracle11g oracle10g


【解决方案1】:

UPDATE 中使用RETURNING 子句:

DECLARE
  deptid  person.id%TYPE;
BEGIN
  UPDATE person
  SET    stat = 'N'
  WHERE  id = 123
  RETURNING MAX(id) INTO deptid;
  
  DBMS_OUTPUT.PUT_LINE('Dept Id: ' || deptid);
END;
/

其中,对于您的测试数据:

create table person(id,stat) AS
SELECT 123, 'Y' FROM DUAL UNION ALL
SELECT 123, 'Y' FROM DUAL UNION ALL
SELECT 345, 'Y' FROM DUAL;

然后 PL/SQL 块输出:

Dept Id: 123

表格包含值:

身份证 |统计数据 --: | :--- 123 | ñ 123 | ñ 345 |是

db小提琴here


如果你真的想使用SELECT 语句,那么你需要确保它只返回一行:

DECLARE
  deptid  person.id%TYPE;
BEGIN
  SELECT id
  INTO   deptid
  FROM   person
  WHERE  id = 123
  AND    ROWNUM = 1; -- FETCH FIRST ROW ONLY; 

  UPDATE person
  SET    stat = 'N'
  WHERE  id = deptid;
  
  DBMS_OUTPUT.PUT_LINE('Dept Id: ' || deptid);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE( 'No Dept Id!' );
END;
/

db小提琴here

【讨论】:

  • 感谢您的回答,但正如我所说,我正在尝试使用从选择查询返回的结果。所以首先它应该选择并存储在变量中并将该变量传递给更新。
  • @Rocky4Ever 为什么?您不需要 SELECT 查询。使用来自UPDATERETURNING 得到完全相同的结果(即设置了deptid 变量)并且只访问数据库一次。
  • 这只是我给我的场景的一个示例数据,我应该能够在多个更新和插入语句中使用从选择查询返回的结果
  • @Rocky4Ever 您可以在多个UPDATEINSERT 语句中使用UPDATE 语句的返回值。
  • 我执行了得到的查询。 ORA-06550:第 2 行,第 24 列:PLS-00103:在预期以下情况之一时遇到符号“文件结尾”::=(;非空范围默认字符错误sqlfiddle.com/#!4/0adbd/20
【解决方案2】:

您作为示例发布的查询存在导致代码失败的错误。 请在 dbms_output 命令中删除 deptid 之后和 ')' 之前的多余管道。

DBMS_OUTPUT.PUT_LINE('Dept Id: ' || deptid);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多