Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dynamiczna składnia SQL przy użyciu EXECUTE IMMEDIATE

OSTRZEŻENIE :Dynamiczny SQL taki jak ten jest podatny na ataki SQL Injection. Tam, gdzie to możliwe, przepisz swój dynamiczny kod SQL, aby zamiast tego używał zmiennych wiązania.

Zamiast konstruować dynamiczny SQL w ten sposób:

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;

Użyj tego:

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;

To nadal podlega wstrzyknięciu SQL pod l_prefix , ale jeśli sterujesz tą wartością programowo, może być OK. Również podzielenie budowy i wykonania SQL na dwa kroki pozwala łatwiej zastąpić EXECUTE IMMEDIATE z DBMS_OUTPUT.PUT_LINE(SQL); aby sprawdzić zapytanie pod kątem błędów składniowych. Możesz także chcieć DBMS_OUTPUT.PUT_LINE Twoje parametry i.CUSTOMER_REF_ID oraz i.CUSTOMER_ID aby sprawdzić ich wartości.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Wywołaj procedurę składowaną wewnątrz pakietu

  2. Jak dodawać komentarze do tabeli w Oracle SQL Developer?

  3. dlaczego ten sql używał unii, wszystkie nie zwróciły żadnych danych?

  4. Konwersja z RAW(16) Oracle na GUID .NET

  5. jak mogę zakodować ciąg w HMAC-SHA256 przy użyciu pl/sql?