【问题标题】:How to create a package using records and stored procedures? oracle如何使用记录和存储过程创建包?甲骨文
【发布时间】:2016-12-01 22:12:34
【问题描述】:

我没用过oracle(只有t-sql)

我需要创建一个必须有记录的包,并在两个存储过程中使用该记录

/*我没用过包 我不知道如何调用(调用或执行包) 我需要在第三个系统中调用它来更新或插入一个人) */

CREATE OR REPLACE PACKAGE PKG_CRM_INSERTUPDATE_PERSONAS IS

/*
this must to  create a stored procedure for insert and update  a table
*/
declare
  TYPE typePersona IS RECORD (
    varNombre: VARCHAR2(200);
    varApellidoPaterno : VARCHAR2(200);
    varApellidoMaterno : VARCHAR2(200);
    varRFC : VARCHAR2(200);
    varIfe : VARCHAR2(200);
    varFechaNacimiento : DATE;
    varNumeroHijos : NUMBER;
    varIdSituacion : NUMBER;
    varIdActividad : NUMBER;
    varIdPais : NUMBER;
    varIdGenero : VARCHAR2(200);
    varIdEstadoCivil : NUMBER;
    varIdLocalidad : NUMBER;
    varIdPersona : NUMBER;
    varCURP : VARCHAR2(200);
    varIdTipoPersona : VARCHAR2(200);
    varCalle : VARCHAR2(200);
    varNumeroExterior : VARCHAR2(200);
    varNumeroPiso : VARCHAR2(200);
    varNumeroDepartamento : VARCHAR2(200);
    )

END;

【问题讨论】:

  • 如果您说您从未使用过 PL/SQL,是什么让您认为您需要定义记录来修改表?你的最终目标是什么?
  • 我需要在包内创建一条记录并使用该记录插入/更新人员表
  • 目标是“为插入/更新包创建一个包”
  • 您可以使用 MERGE 语句执行此操作(插入或更新)。
  • 你真的找不到任何用于 PL/SQL 的 documentationexamples 吗?看起来您刚刚在 Oracle 中尝试了一些 T-SQL,并在第一次不起作用时来到这里。

标签: oracle stored-procedures plsql


【解决方案1】:

如果您只需要在表中插入/更新记录,您可能不需要定义记录,但您可以找到更简单的方法。

但是,关于包的创建和使用,你的头部声明有一些错误,刚刚修复:

CREATE OR REPLACE PACKAGE PKG_CRM_INSERTUPDATE_PERSONAS IS

  TYPE typePersona IS RECORD (
    varNombre VARCHAR2(200),
    varApellidoPaterno  VARCHAR2(200),
    varApellidoMaterno  VARCHAR2(200),
    varRFC  VARCHAR2(200),
    varIfe  VARCHAR2(200),
    varFechaNacimiento  DATE,
    varNumeroHijos  NUMBER,
    varIdSituacion  NUMBER,
    varIdActividad  NUMBER,
    varIdPais  NUMBER,
    varIdGenero  VARCHAR2(200),
    varIdEstadoCivil  NUMBER,
    varIdLocalidad  NUMBER,
    varIdPersona  NUMBER,
    varCURP  VARCHAR2(200),
    varIdTipoPersona  VARCHAR2(200),
    varCalle  VARCHAR2(200),
    varNumeroExterior  VARCHAR2(200),
    varNumeroPiso  VARCHAR2(200),
    varNumeroDepartamento  VARCHAR2(200)
    );

    procedure someProcIn(pIn IN typePersona);
    procedure someProcInOut(pInOut IN OUT typePersona);

END;

但是,如果没有主体,包头不会做任何事情,您可以在主体中编写程序;例如:

CREATE OR REPLACE PACKAGE body PKG_CRM_INSERTUPDATE_PERSONAS IS

    procedure someProcIn(pIn IN typePersona) is
    begin
        dbms_output.put_line(pIn.varNombre);
    end;

    procedure someProcInOut(pInOut IN OUT typePersona) is
    begin
        pInOut.varNombre := 'varNombre value';
    end;

END;

一旦你的包被创建,你可以这样调用它的过程和函数(你调用一个包中包含的过程或函数,而不是包本身):

declare
    myVar  PKG_CRM_INSERTUPDATE_PERSONAS.typePersona;
begin    
    --
    PKG_CRM_INSERTUPDATE_PERSONAS.someProcInOut(myVar);
    --
    PKG_CRM_INSERTUPDATE_PERSONAS.someProcIn(myVar); 
end;      

【讨论】:

  • Aleksej,如果记录的结构与行的结构相同,则可以简化 - 根本不需要记录类型声明。 Here is an example。但是,如果 OP 说数据来自某个第三方系统,则可能需要将 oracle 记录类型转换为模式级别的对象类型并进行相应的映射。但是我们不确定该过程在那里是否有效,OP不想分享;-)
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多