sql >> Database teknologi >  >> RDS >> Oracle

Dynamisk SQL-syntaks ved hjælp af EXECUTE IMMEDIATE

ADVARSEL :Dynamisk SQL som denne er modtagelig for SQL Injection-angreb. Hvor det er muligt, omskriv din dynamiske SQL for at bruge bindevariabler i stedet.

I stedet for at konstruere din dynamiske SQL sådan her:

L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = '||i.CUSTOMER_REF_ID||' WHERE CUSTOMER_ID = '||i.CUSTOMER_ID;
EXECUTE IMMEDIATE L_SQL;

Brug denne:

L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = :REF_ID WHERE CUSTOMER_ID = :CUST_ID';
EXECUTE IMMEDIATE L_SQL USING i.CUSTOMER_REF_ID, i.CUSTOMER_ID;

Dette er stadig underlagt SQL-injektion ved l_prefix , men hvis du styrer denne værdi programmatisk, kan det være OK. Ved at dele konstruktionen af ​​SQL'en og udførelsen af ​​SQL'en i to trin kan du nemmere erstatte EXECUTE IMMEDIATE med DBMS_OUTPUT.PUT_LINE(SQL); for at kontrollere din forespørgsel for syntaksfejl. Du kan også ønske at DBMS_OUTPUT.PUT_LINE dine parametre i.CUSTOMER_REF_ID og i.CUSTOMER_ID for at kontrollere deres værdier.




  1. Docker compose postgresql service - kan du ikke oprette bruger og database under build?

  2. Sådan installeres og sikres MariaDB på CentOS 7

  3. Mindste værdi, men ikke NULL i Oracle SQL

  4. Sorterbare UUID'er og tilsidesættende ActiveRecord::Base