【问题标题】:Creating a stored procedure with IN and OUT Paramters使用 IN 和 OUT 参数创建存储过程
【发布时间】:2018-09-19 00:46:27
【问题描述】:

这是我第一次创建同时具有 IN 和 OUT 参数的存储过程,我很迷茫。我想要做的是让 API 将 3 个参数(ID_TX、FORM_NAME 和 DATA_DATE)传递到我的存储过程中,并让我的存储过程执行一个简单的插入,然后传递一个值(SUBMISSION_ID)。但是,当我尝试编译代码时,我不断收到错误消息。错误如下:

 Error(8,1): PLS-00103: Encountered the symbol "INSERT" when expecting one of the following:     begin function pragma procedure subtype type <an identifier>    <a double-quoted delimited-identifier> current cursor delete    exists prior The symbol "begin" was substituted for "INSERT" to continue. 

Error(10,1): PLS-00103: Encountered the symbol "RETURNING" when expecting one of the following:     . ( ) , * % & = - + < / > at in is mod remainder not rem =>    <an exponent (**)> <> or != or ~= >= <= <> and or like like2    like4 likec between || multiset member submultiset 

Error(11,1): PLS-00103: Encountered the symbol "END" 

我是否缺少一些语法基础/知识?提前致谢!

create or replace procedure API_SUBMISSION(rID_TX IN VARCHAR, rFORM_NAME IN VARCHAR, rDATA_DATE IN VARCHAR, v_submission_id OUT NUMBER)
IS BEGIN
DECLARE
v_submission_id number;
insert into submission (SUBMISSION_ID, RESPONDENT_ID, SUBMISSION_DT, SUBMISSION_TYPE_ID, SUBMISSION_NAME_TX, SUBMISSION_SEQ_NB, CREATE_DT, CREATE_USER_ID, MODIFY_DT, MODIFY_USER_ID, EFFECTIVE_DT, INACTIVE_DT)
            VALUES (null, get__respondent_id(rID_TX, rFORM_NAME, trunc(sysdate), sysdate, rDATA_DATE || 'TEST ' || rFORM_NAME, 1, sysdate, 1, null, null, null, null)
returning submission_id into v_submission_id;
END API_SUBMISSION;

【问题讨论】:

  • 您遇到的错误是什么?
  • 抱歉,我意识到我遗漏了它们,只是按照你的要求添加了它们 :)
  • 我很笨。当我在网上查看一些示例时,它已经“返回”,对此感到抱歉
  • 你是正确的,返回是正确的。这是在这个 SO 上重复的:stackoverflow.com/questions/5558979/…
  • 啊,也许我需要学习如何更好地搜索。我试过找但没找到:(你是怎么这么快/这么容易地搜索到的(尤其是7年前的问题??)?

标签: sql oracle plsql


【解决方案1】:

您的程序存在几个问题:

  1. 您已经声明了一个out参数来保存返回的submission_id,所以不需要重新声明它。
  2. 您不需要在过程/函数中使用 declare 关键字,除非 a) 它是一个匿名块或 b) 您正在嵌套 PL/SQL 块。你什么都不做;您可以简单地利用 IS/ASBEGIN 关键字之间的隐式声明部分。在这种情况下,您不需要这样做。
  3. 您在调用 get__respondent_id 时缺少右括号 - 我假设它有两个参数?

这意味着您可以将您的程序重写为:

CREATE OR REPLACE PROCEDURE api_submission(rid_tx          IN VARCHAR2,
                             rform_name      IN VARCHAR2,
                             rdata_date      IN VARCHAR2,
                             v_submission_id OUT NUMBER) IS
BEGIN
  INSERT INTO submission
    (submission_id,
     respondent_id,
     submission_dt,
     submission_type_id,
     submission_name_tx,
     submission_seq_nb,
     create_dt,
     create_user_id,
     modify_dt,
     modify_user_id,
     effective_dt,
     inactive_dt)
  VALUES
    (NULL,
     get__respondent_id(reia_id_tx, rform_name),
     trunc(SYSDATE),
     SYSDATE,
     rdata_date || 'TEST ' || rform_name,
     1,
     SYSDATE,
     1,
     NULL,
     NULL,
     NULL,
     NULL)
  RETURNING submission_id INTO v_submission_id;

END api_submission;
/

【讨论】:

  • 不先生,被访者id函数的参数是(id_tx, form_name and trunc(sysdate))
  • "sir" 有点自以为是,不是吗?关于您的声明 - 您在插入列列表中指定了 12 列,但是(假设 get__respondent_id 函数调用的三个参数)只有 11 个值传入。您需要确保传入正确的值。我会留给你解决这个问题,因为你比我更了解你的表格和数据。
猜你喜欢
  • 2011-07-29
  • 2012-04-18
  • 2020-09-22
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多