Как вызвать процедуру в oracle для входного параметра в качестве типов? - PullRequest
0 голосов
/ 12 марта 2019

Сегмент кода для оракула, чтобы вызвать proc, где мы используем переменные типа в качестве входного параметра.

1 - При таком подходе мы могли бы вызвать proc параметра входного типа.

CREATE OR REPLACE TYPE callbck AS TABLE OF callback_t;
CREATE OR REPLACE TYPE CALLBACK_T AS OBJECT
(
   p_grading_id NUMBER,
   p_name VARCHAR2 (500),
   p_value VARCHAR2 (500)
);
CREATE TABLE CALLBACK_T_temp
(
   p_grading_id   NUMBER,
   p_name         VARCHAR2 (500),
   p_value        VARCHAR2 (500)
);
CREATE OR REPLACE PROCEDURE log_errors (p_error_message IN callbck)
AS
BEGIN
   INSERT INTO CALLBACK_T_temp
      SELECT *
        FROM TABLE (p_error_message) COMMIT;
END;
/
SELECT * FROM CALLBACK_T_temp;
COMMIT;
DECLARE
   P_ERROR_MESSAGE   callbck;
BEGIN
   P_ERROR_MESSAGE :=
      callbck (CALLBACK_T (1, 'name1', 'value1'),
               CALLBACK_T (1, 'name2', 'value2'),
               CALLBACK_T (1, 'name3', 'value3'));
   CRADLE_DEV_ENV11_O.LOG_ERRORS (P_ERROR_MESSAGE);
   COMMIT;
END;
SELECT * FROM CALLBACK_T_temp;
TRUNCATE TABLE CALLBACK_T_temp;

2 - это еще один подход, с помощью которого мы можем вызывать proc для параметра входного типа.

CREATE TABLE temp
(
   p_grading_id   NUMBER,
   p_name         VARCHAR2 (500),
   p_value        VARCHAR2 (500)
);
INSERT INTO temp
     VALUES (1, 'name1', 'value1');
INSERT INTO temp
     VALUES (1, 'name2', 'value2');
INSERT INTO temp
     VALUES (1, 'name3', 'value3');
COMMIT;
SELECT * FROM temp;
DECLARE
   P_ERROR_MESSAGE   callbck;
BEGIN
   SELECT CALLBACK_T (e.p_grading_id, e.p_name, e.p_value)
     BULK COLLECT INTO P_ERROR_MESSAGE
     FROM temp e;
   CRADLE_DEV_ENV11_O.LOG_ERRORS (P_ERROR_MESSAGE);
END;
/
SELECT * FROM CALLBACK_T_temp;
TRUNCATE TABLE CALLBACK_T_temp;

3- При таком подходе мы можем вызывать proc для параметра входного типа, но тип объекта внутри типа объекта.

CALLING OBJECT INSIDE OBJECT
**DECLARE
   P_VALUES   P_OBJECT;
BEGIN
   P_VALUES :=
      P_OBJECT (
         1000,
         name_value_table (name_value_object ('NAME1', 'VALUE1'),
                           name_value_object ('NAME2', 'VALUE2'),
                           name_value_object ('NAME3', 'VALUE3')));
   PKG.PROC (P_VALUES);
   COMMIT;
END**;

Так есть ли другой способ, которым мы могли бы вызвать процедуру входного параметра как тип.

...