首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在间隔中插入过程值

问在间隔中插入过程值
EN

Stack Overflow用户
提问于 2019-04-19 08:17:00
回答 2查看 43关注 0票数 2

我需要以下方面的帮助:

我有下表:

代码语言:javascript
复制
CREATE TABLE LOG_PUSH_READOUTS_HEADERS

(

ID NUMBER NOT NULL,

PUSH_DATE DATE NOT NULL,

SOURCE_SERIAL VARCHAR2(100) NOT NULL,

SOURCE_START_DATE DATE NOT NULL,

SOURCE_END_DATE DATE NOT NULL,

SOURCE_RUS_TYPE_ID NUMBER,

OUTPUT_SERIAL VARCHAR2(100) NOT NULL,

FILTERS_RUS VARCHAR2(100),

FILTERS_INDICATORS VARCHAR2(100),

CONSTRAINT id_pk PRIMARY KEY (ID)

);

我需要执行以下程序:

在表中插入的输入参数都是除了ID之外的所有列,我们需要为此创建一个排序器。输出参数为ID和RESULT_CODE。ID是插入的主键的值。如果过程成功,则RESULT_CODE为零,或区间为99-9999的某个值。对错误使用RESULT_CODE,例如,RESULT_CODE 9123为“FILTER_RUS不能为空”。

以下是我的尝试:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE INSERT_HEADER
(PUSH_DATE IN DATE, SOURCE_SERIAL IN VARCHAR2, SOURCE_START_DATE IN DATE, SOURCE_END_DATE IN DATE, SOURCE_RUS_TYPE_ID IN NUMBER, 
OUTPUT_SERIAL IN VARCHAR2, FILTERS_RUS IN VARCHAR2, FILTERS_INDICATORS IN VARCHAR2, ID OUT NUMBER, RESULT_CODE OUT NUMBER)

IS
hd_seq NUMBER;

BEGIN

SELECT AMM_MDM.Header_Seq.NEXTVAL INTO hd_seq FROM DUAL;
ID:=hd_seq;
INSERT INTO AMM_MDM.LOG_PUSH_READOUTS_HEADERS (PUSH_DATE IN DATE, SOURCE_SERIAL IN VARCHAR2, SOURCE_START_DATE IN DATE, 
SOURCE_END_DATE IN DATE, SOURCE_RUS_TYPE_ID IN NUMBER, 
OUTPUT_SERIAL IN VARCHAR2, FILTERS_RUS IN VARCHAR2, FILTERS_INDICATORS IN VARCHAR2)
VALUES (PUSH_DATE, SOURCE_SERIAL, SOURCE_START_DATE, 
SOURCE_END_DATE, SOURCE_RUS_TYPE_ID, 
OUTPUT_SERIAL, FILTERS_RUS, FILTERS_INDICATORS)

END;

如何将RESULT_CODE设置为间隔99-9999?如何管理错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-19 08:53:51

我理解这个问题的方式,就像下面的例子。我缩短了列列表(不想绑那么多),但你应该能得到大致的想法。

代码语言:javascript
复制
create or replace procedure p_insert_header
  (p_push_date     in date,
   p_source_serial in varchar2,
   p_filter_rus    in varchar2,
   --
   p_id           out number,
   p_result_code  out number
  )
is
  l_id number;
begin
  -- check for errors
  if p_push_date is null then 
     p_result_code := 1234;
  elsif p_source_serial not in ('A', 'B', 'C') then
     p_result_code := 5532;
  elsif p_filter_rus is null then
     p_result_code := 9123;
  end if;

  -- if there are no errors, do insert
  if p_result_code is null then
     -- fetch sequence number
     p_id := header_seq.nextval;

     insert into log_push_readouts_headers
       (id, push_date, source_serial, filter_rus)
       values
       (p_id, p_push_date, p_source_serial, p_filter_rus);
  end if;
end;

最后,一旦过程完成,它将返回-作为OUT参数:

  • ID:
    • 一些序列号,如果一切正常的话
    • 空,如果不是

​

  • RESULT_CODE:
    • 空,如果一切正常
    • 错误号,如果不是

​

票数 0
EN

Stack Overflow用户

发布于 2019-04-19 08:54:52

对于用户定义的错误,Oracle允许范围-20000 .. -20999中的负整数。您需要删除insert语句的列列表的数据类型声明。

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE INSERT_HEADER(PUSH_DATE          IN DATE,
                                          SOURCE_SERIAL      IN VARCHAR2,
                                          SOURCE_START_DATE  IN DATE,
                                          SOURCE_END_DATE    IN DATE,
                                          SOURCE_RUS_TYPE_ID IN NUMBER,
                                          OUTPUT_SERIAL      IN VARCHAR2,
                                          FILTERS_RUS        IN VARCHAR2,
                                          FILTERS_INDICATORS IN VARCHAR2,
                                          ID                 OUT NUMBER,
                                          RESULT_CODE        OUT NUMBER)
IS
BEGIN
  INSERT INTO LOG_PUSH_READOUTS_HEADERS
    (ID,
     PUSH_DATE,
     SOURCE_SERIAL,
     SOURCE_START_DATE,
     SOURCE_END_DATE,
     SOURCE_RUS_TYPE_ID,
     OUTPUT_SERIAL,
     FILTERS_RUS,
     FILTERS_INDICATORS)
  VALUES
    (Header_Seq.NEXTVAL,
     PUSH_DATE,
     SOURCE_SERIAL,
     SOURCE_START_DATE,
     SOURCE_END_DATE,
     SOURCE_RUS_TYPE_ID,
     OUTPUT_SERIAL,
     FILTERS_RUS,
     FILTERS_INDICATORS);

  --Suppose some opertions performed and gave the RESULT_CODE value below
     RESULT_CODE := 20123;

  IF    RESULT_CODE = 20123 THEN raise_application_error(-RESULT_CODE, 'FILTER_RUS cannot be null'); 
--ELSIF RESULT_CODE = 20124 THEN raise_application_error(-RESULT_CODE, 'Some other message 1');
--ELSIF RESULT_CODE = 20125 THEN raise_application_error(-RESULT_CODE, 'Some other message 2');
  END IF;     
END;

在本例中,它随消息抛出:FILTER_RUS cannot be null

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55758727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档