How To Pass Array in where clause in Oracle?
Array can be passed in WHERE clause of sql query and in PLSQL as well.
But to use any array in a SQL query, we will store the array data inside database.
Setup for passing array in WHERE clause in Oracle SQL:
Creating a record type EMP_REC_TYPE in DB:
--How To Pass Array in where clause in Oracle? : Setup CREATE OR REPLACE TYPE EMP_REC_TYPE AS OBJECT (EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(20), SALARY NUMBER(8, 2) ); /
Creating a table type EMP_TAB_TYPE with record type EMP_REC_TYPE:
CREATE OR REPLACE TYPE EMP_TAB_TYPE AS TABLE OF EMP_REC_TYPE; /
Creating a new table with table type EMP_TAB_TYPE:
CREATE TABLE EMPLOYEES_TEMP (EMP_DTL EMP_TAB_TYPE) NESTED TABLE EMP_DTL STORE AS EMP_DETAILS;
Inserting data into EMP_TEMP table:
--How To Pass Array in where clause in Oracle? : Setup BEGIN FOR I IN (SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY FROM EMPLOYEES WHERE DEPARTMENT_ID = 30) LOOP INSERT INTO EMPLOYEES_TEMP VALUES(EMP_TAB_TYPE(EMP_REC_TYPE(I.EMPLOYEE_ID, I.FIRST_NAME, I.LAST_NAME, I.SALARY))); END LOOP; END; /
Viewing the raw data of EMPLOYEES_TEMP table:
SELECT * FROM EMPLOYEES_TEMP;
Data from above query is not user readable format. To convert the data into user readable format use the below query:
SELECT B.EMPLOYEE_ID, B.FIRST_NAME, B.LAST_NAME, B.SALARY FROM EMPLOYEES_TEMP A, TABLE(A.EMP_DTL) B;
Using the data of EMPLOYEES_TEMP table in the WHERE clause of EMPLOYEES table:
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID IN (SELECT B.EMPLOYEE_ID FROM EMPLOYEES_TEMP A, TABLE(A.EMP_DTL) B );
Setup for passing array in WHERE clause in Oracle PLSQL:
SET SERVEROUTPUT ON; DECLARE TYPE EMP_REC IS RECORD (EMPLOYEE_ID EMPLOYEES.EMPLOYEE_ID%TYPE, FIRST_NAME EMPLOYEES.FIRST_NAME%TYPE, LAST_NAME EMPLOYEES.LAST_NAME%TYPE, SALARY EMPLOYEES.SALARY%TYPE ); -- TYPE T_EMP_TAB IS TABLE OF EMP_REC INDEX BY PLS_INTEGER; V_EMP_TAB T_EMP_TAB; BEGIN SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY BULK COLLECT INTO V_EMP_TAB FROM EMPLOYEES WHERE EMPLOYEE_ID IN (SELECT B.EMPLOYEE_ID FROM EMPLOYEES_TEMP A, TABLE(A.EMP_DTL) B ); -- FOR I IN 1..V_EMP_TAB.COUNT LOOP DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID -> '||V_EMP_TAB(I).EMPLOYEE_ID||' -> NAME -> '||V_EMP_TAB(I).FIRST_NAME||' '||V_EMP_TAB(I).LAST_NAME||' -> SALARY -> '||V_EMP_TAB(I).SALARY); END LOOP; END; /
RELATED TOPICS: