如何将rowtype或RECORD当做参数传递给procedure????
如,我在触发器中定义
rowtype或RECORD
,然后将rowtype或RECORD作为参数,传递给procedure
,然后在procedure中处理数据,哪位大侠知道,麻烦告知,谢谢!!
如,我在触发器中定义
rowtype或RECORD
,然后将rowtype或RECORD作为参数,传递给procedure
,然后在procedure中处理数据,哪位大侠知道,麻烦告知,谢谢!!
IS
RECORD
(
a a.字段%TYPE,
b b.字段%TYPE,
.
.
);
XXX_REC XXX_TYPE;
在函数中使用该类型
FUNCTION XXX
(
XXX_REC IN XXX_TYPE,
.
.
)
RETURN NUMBER
IS
BEGIN
ccc = XXX_REC.字段;
EXCEPTION END XXX;
create or replace trigger TIA_T_RESULT_HEAD
after insert on t_result_head
for each ROW
BEGIN
Proc_EDI_Result(:new.Business_Type,
:new.Declare_Type,
:new.Check_Mark,
:new.Result_Type,
:new.Corp_No,
:new.Corp_Code,
:new.Appr_No,
:new.check_date);
end TIA_T_RESULT_HEAD;
==============================
因为参数有可能越来越多,我就想将各个字段的值,作为一个集合来传递给我的存储过程
我的存储过程如下:
create or replace procedure PROC_EDI_RESULT_1((P_Business_Type in varchar2,P_Declare_Type in varchar2,P_Check_Mark in char,P_Result_Type in char,P_Corp_No in varchar2,P_Corp_Code in varchar2,P_Ems_Appr_No in varchar2,P_CHECK_DATE in date) As
V_Head_ID varchar2(36);
V_CancelDeclare_Flag char(1);
V_CancelAudit_Flag char(1);
V_Count number;
V_Modify_times number;
begin
case P_Business_Type
When '01' Then
Begin
Select nvl(Max(Ems_Head_ID),' ') into V_Head_ID From T_Ems_Head Where Corp_Ems_No = P_Corp_No And Current_Flag = '1';
Select nvl(Max(CancelDeclare_Flag),'0') into V_CancelDeclare_Flag From T_Ems_Head Where Corp_Ems_No = P_Corp_No And Current_Flag = '1' And Query_Flag = '1';
Select nvl(Max(CancelAudit_Flag),'0') into V_CancelAudit_Flag From T_Ems_Head Where Corp_Ems_No = P_Corp_No And Current_Flag = '1' And Query_Flag != '1';
End;
When '03' Then
begin
....
....
End;
End Case; exception
When CASE_NOT_FOUND then
dbms_output.put_line('业务类型:'|| P_Business_Type || '或回执类型:' || P_Check_Mark || '超过处理范围');
When others then
dbms_output.put_line('错误号:'||SQLCODE || ',错误信息:'||SQLERRM);
end PROC_EDI_RESULT;
--------------------
哪位大侠能给个例子,谢谢!
Name Type Nullable Default Comments
---- ------ -------- ------- --------
ID NUMBER Y SQL>
SQL> create or replace procedure test_pro (v_rowtype1 ta%rowtype)
2 as
3 id number;
4 v_rowtype ta.id%type;
5 begin
6
7 insert into ta values(id);
8 insert into ta values(v_rowtype1.id);
9 insert into ta values(v_rowtype);
10 end test_pro;
11 /Procedure createdSQL>
现在我换一种说法。比如:
我不要在存储过程中处理数据了,我把它们放到触发器中处理,如下:
create or replace trigger TIA_T_RESULT_HEAD
after insert on t_result_head
for each ROW
DECLARE
P_Business_Type t_result_head.business_type%TYPE;
P_Check_Mark t_result_head.check_%TYPE;
P_Appr_fec_Code t_result_head.appr_fec_code%TYPE;
P_Appr_fec_Name t_result_head.appr_fec_name%TYPE;
BEGIN
P_Business_Type := :new.Business_Type;
P_Check_Mark := :new.check_;
P_Appr_fec_Code := :new.appr_fec_code;
P_Appr_fec_Name := :new.appr_fec_name; exception
When integrity_error then
dbms_output.put_line('业务类型:'|| P_Business_Type || '或回执类型:' || P_Check_Mark || '超过处理范围');
When others then
dbms_output.put_line('错误号:'||SQLCODE || ',错误信息:'||SQLERRM);End TIA_T_RESULT_HEAD;===============================
请问上面的是否有错误???
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4) Y
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y
HIREDATE DATE Y
SAL NUMBER(7,2) Y
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2) Y SQL> SELECT * FROM EMP_TEST;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20Executed in 0.016 seconds-- package 代码:
CREATE OR REPLACE PACKAGE SCOTT.PKG_TRIGGER_TEST IS
TYPE T_EMP IS TABLE OF SCOTT.EMP_TEST%ROWTYPE INDEX BY BINARY_INTEGER;
V_EMPS T_EMP;
V_NUM BINARY_INTEGER := 0;
END ;-- 行级触发器得发NEW值:
CREATE OR REPLACE TRIGGER SCOTT.GET_EMP_ROW
AFTER INSERT ON SCOTT.EMP_TEST
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('-- TRIGGER SCOTT.GET_EMP_ROW START --');
SCOTT.PKG_TRIGGER_TEST.V_NUM := SCOTT.PKG_TRIGGER_TEST.V_NUM + 1;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).EMPNO := :NEW.EMPNO;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).ENAME := :NEW.ENAME;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).JOB := :NEW.JOB;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).MGR := :NEW.MGR;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).HIREDATE := :NEW.HIREDATE;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).SAL := :NEW.SAL;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).COMM := :NEW.COMM;
SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).DEPTNO := :NEW.DEPTNO;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||' : '||SQLERRM);
END GET_EMP_ROW;-- 表级触发器得到最大工资等Operation:
CREATE OR REPLACE TRIGGER SCOTT.TIA_T_RESULT_HEAD
AFTER INSERT ON SCOTT.EMP_TEST
DECLARE
-- local variables here
V_EMP_NO NUMBER;
V_MANAGER_NO NUMBER;
V_EMP_DATE DATE;
V_DEPT_NO NUMBER;
V_MAX_SALARY SCOTT.EMP_TEST.SAL%TYPE;
V_STEP VARCHAR2(100) := '';
BEGIN
DBMS_OUTPUT.PUT_LINE('-- TRIGGER SCOTT.TIA_T_RESULT_HEAD START --');
V_STEP := 'GET NEW VALUES';
FOR I IN 1..SCOTT.PKG_TRIGGER_TEST.V_EMPS.COUNT LOOP
V_EMP_NO := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).EMPNO;
V_MANAGER_NO := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).MGR;
V_EMP_DATE := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).HIREDATE;
V_DEPT_NO := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).DEPTNO;
DBMS_OUTPUT.PUT_LINE('EMP_NO: '||V_EMP_NO||' MANAGER_NO: '||V_MANAGER_NO||' EMP_DATE: '||V_EMP_DATE||' DEPT_NO: '||V_DEPT_NO);
V_STEP := 'GET MAX SALARY';
SELECT NVL(MAX(SAL),0)
INTO V_MAX_SALARY
FROM SCOTT.EMP_TEST
WHERE DEPTNO = V_DEPT_NO;
V_STEP := 'PRINT MAX SALARY AFTER INSERTED RECORDS';
DBMS_OUTPUT.PUT_LINE('MAX SALARY: '||V_MAX_SALARY);
DBMS_OUTPUT.PUT_LINE('');
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error at : '||V_STEP);
DBMS_OUTPUT.PUT_LINE(SQLCODE||' : '||SQLERRM);
END TIA_T_RESULT_HEAD;-- 测试结果:
SQL> INSERT INTO SCOTT.EMP_TEST
2 SELECT 7768,'MANTISXF','SALESER',7369,SYSDATE,3000,NULL,30 FROM DUAL
3 UNION ALL
4 SELECT 7780,'FENG','MONTIORER',7368,SYSDATE,5000,NULL,20 FROM DUAL
5 ;-- TRIGGER SCOTT.GET_EMP_ROW START --
-- TRIGGER SCOTT.GET_EMP_ROW START --
-- TRIGGER SCOTT.TIA_T_RESULT_HEAD START --
EMP_NO: 7768 MANAGER_NO: 7369 EMP_DATE: 28-9月 -08 DEPT_NO: 30
MAX SALARY: 3000EMP_NO: 7780 MANAGER_NO: 7368 EMP_DATE: 28-9月 -08 DEPT_NO: 20
MAX SALARY: 5000
2 rows insertedExecuted in 0.25 secondsSQL> COMMIT;Commit completeExecuted in 0 secondsSQL> SELECT * FROM EMP_TEST;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7768 MANTISXF SALESER 7369 2008-9-28 1 3000.00 30
7780 FENG MONTIORER 7368 2008-9-28 1 5000.00 20Executed in 0.031 secondsSQL> INSERT INTO SCOTT.EMP_TEST VALUES(8866,'CSDN','MANAGER',7369,SYSDATE,8000,NULL,10);-- TRIGGER SCOTT.GET_EMP_ROW START --
-- TRIGGER SCOTT.TIA_T_RESULT_HEAD START --
EMP_NO: 7768 MANAGER_NO: 7369 EMP_DATE: 28-9月 -08 DEPT_NO: 30
MAX SALARY: 3000EMP_NO: 7780 MANAGER_NO: 7368 EMP_DATE: 28-9月 -08 DEPT_NO: 20
MAX SALARY: 5000EMP_NO: 8866 MANAGER_NO: 7369 EMP_DATE: 28-9月 -08 DEPT_NO: 10
MAX SALARY: 8000
1 row insertedExecuted in 0.015 secondsSQL> COMMIT;Commit completeExecuted in 0.015 secondsSQL> SELECT * FROM EMP_TEST;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7768 MANTISXF SALESER 7369 2008-9-28 1 3000.00 30
7780 FENG MONTIORER 7368 2008-9-28 1 5000.00 20
8866 CSDN MANAGER 7369 2008-9-28 1 8000.00 10Executed in 0.015 seconds