简体   繁体   中英

SQL PL/SQL dynamic variable binding

I would like to run below query:

SELECT 
    * 
FROM 
    TABLE1
WHERE 
    COL1 = :DynamicValue1
    AND  COL2 = :DynamicValue2
USING 
    USERENTEREDVALUE1, USERENTEREDVALUE2;

I don't want to use EXECUTE IMMEDIATE .

How can I use using keyword in select query? When I run this I get pop up to enter value but it gives error Ora-00933

You may use substitution variables

DEFINE lname = 'Rogers'
DEFINE mgrid = 122

SELECT *
FROM employees
WHERE last_name = '&lname'
AND manager_id  = '&mgrid';

When you run this in SQL developer or SQL* Plus, you get

old:SELECT *
FROM employees
WHERE last_name = '&lname'
AND manager_id  = &mgrid
new:SELECT *
FROM employees
WHERE last_name = 'Rogers'
AND manager_id  = 122

EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DAT JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- -------- ---------- ---------- -------------- ---------- -------------
        134 Michael              Rogers                    MROGERS                   650.127.1834         26-08-06 ST_CLERK         2900                       122            50

Or use Bind variables

VARIABLE   lname VARCHAR2(40) 
VARIABLE  mgrid NUMBER 
EXEC :lname := 'Rogers'
EXEC :mgrid := 122
VARIABLE x REFCURSOR


BEGIN
     OPEN :x FOR SELECT *
                 FROM employees
                 WHERE last_name =:lname 
                 AND manager_id =:mgrid;
END;
/

    PRINT x

Result

PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.



EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DAT JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- -------- ---------- ---------- -------------- ---------- -------------
        134 Michael              Rogers                    MROGERS                   650.127.1834         26-08-06 ST_CLERK         2900                       122            50

I'm not sure if you're doing pl/sql , but if you do, you can simply add variables to you query:

declare
    USERENTEREDVALUE1 VARCHAR2(100) := 'value1';
    USERENTEREDVALUE2 VARCHAR2(100) := 'value2';
    RESULTVALUE VARCHAR2(100);
begin

    SELECT COL3
      INTO RESULTVALUE
      FROM  (
                SELECT 'value1' COL1, 'value2' COL2, 'Ok' COL3 FROM dual UNION ALL
                SELECT 'value3' COL1, 'value4' COL2, 'NOK' COL3 FROM dual
            ) TABLE1
    WHERE COL1 = USERENTEREDVALUE1
      AND COL2 = USERENTEREDVALUE2;

    dbms_output.put_line('RESULTVALUE: ' || RESULTVALUE); 
end;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM