Home » SQL & PL/SQL » SQL & PL/SQL » How to pass in dynamic variable for calling store procedure (Oracle 11g)
| How to pass in dynamic variable for calling store procedure [message #550504] |
Mon, 09 April 2012 23:27  |
 |
aimei
Messages: 5 Registered: April 2012
|
Junior Member |
|
|
I have a table that has 10 columns which is used to store the customer information (e.g Gender, Age, Name). And i have wrote a store procedure to compare the before and after value of column since there has a parameter to control which column need/no need to be updated while the value being changed.
For example, master table "CUST" has column (NAME, GENDER, AGE). "CUST_TEMP" is a temporary table to store the input image which has the same table structure as "CUST".
DECLARE
bef_val CUST%ROWTYPE;
aft_val CUST_TEMP%ROWTYPE;
BEGIN
SELECT * INTO bef_val FROM CUST WHERE name = 'ABC';
SELECT * INTO aft_val FROM CUST_TEMP WHERE name = 'ABC';
-- Store procedure 'sp_compare_val' is used to compare the
-- before and after image of each column
sp_compare_val ( bef_val.NAME, aft_val.NAME);
sp_compare_val ( bef_val.GENDER, aft_val.GENDER);
sp_compare_val ( bef_val.AGE, aft_val.AGE);
END;
/
For the above case, i need to type 3 times of "sp_compare_val ( bef_val.xxx, aft_val.xxx )" on the program. And if the table has more than 10 columns, i need to type more than 10 times.
Thus, is it possible to pass in a dynamic variable while calling the store procedure. let say, where the 'xxx' can be definable?
Thanks
|
|
|
|
|
|
| Re: How to pass in dynamic variable for calling store procedure [message #550524 is a reply to message #550505] |
Tue, 10 April 2012 01:49   |
 |
aimei
Messages: 5 Registered: April 2012
|
Junior Member |
|
|
More details of the program:
CREATE TABLE CUST ( NAME VARCHAR2(50), GENDER VARHCAR2(1), AGE NUMBER(3) );
INSERT INTO CUST VALUES ( 'ABC', 'F', 20 );
CREATE TABLE CUST_TEMP ( NAME VARCHAR2(50), GENDER VARHCAR2(1), AGE NUMBER(3) );
INSERT INTO CUST_TEMP VALUES ( 'ABC', 'M', 21 );
CREATE OR REPLACE PROCEDURE sp_compare_val ( col_nam IN VARCHAR2, bef_val IN VARCHAR2, aft_val IN VARCHAR2, sql_stmt IN OUT VARCHAR2 ) AS
upd_ind VARCHAR2(1);
BEGIN
IF col_nam IN ( 'NAME', 'GENDER' ) THEN
upd_ind := 'N';
ELSE
upd_ind := 'Y';
END IF;
IF upd_ind = 'Y' THEN
IF sql_stmt IS NOT NULL THEN
sql_stmt := sql_stmt ||', ';
END IF;
sql_stmt := sql_stmt || col_nam ||' = '''|| aft_val || '''';
END IF;
END;
/
-- Main Program
set serveroutput on size unlimited
DECLARE
b_val CUST%ROWTYPE;
a_val CUST_TEMP%ROWTYPE;
sql_stmt VARCHAR2(2000);
upd_stmt VARCHAR2(2000);
c NUMBER;
cnt NUMBER;
BEGIN
SELECT * INTO b_val FROM CUST WHERE name = 'ABC';
SELECT * INTO a_val FROM CUST_TEMP WHERE name = 'ABC';
sp_compare_val ( 'NAME', b_val.name, a_val.name, sql_stmt );
sp_compare_val ( 'GENDER', b_val.gender, a_val.gender, sql_stmt );
sp_compare_val ( 'AGE', b_val.age, a_val.age, sql_stmt );
upd_stmt := 'UPDATE CUST SET '||sql_stmt||' WHERE name = ''ABC''';
c := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE( c, upd_stmt, DBMS_SQL.NATIVE );
cnt := DBMS_SQL.EXECUTE ( c );
DBMS_SQL.CLOSE_CURSOR( c );
END;
/
Thus, any method that can dynamically pass-in the variable name while calling the sp_compare_val.
Thanks.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Goto Forum:
Current Time: Thu May 23 08:44:24 CDT 2013
Total time taken to generate the page: 0.10509 seconds
|