Oracle
 sql >> база данни >  >> RDS >> Oracle

Динамичен SQL синтаксис, използващ EXECUTE IMMEDIATE

ПРЕДУПРЕЖДЕНИЕ :Динамичен SQL като този е податлив на атаки чрез SQL инжектиране. Където е възможно, пренапишете вашия динамичен SQL, за да използвате вместо него свързващи променливи.

Вместо да конструирате своя динамичен SQL по този начин:

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;

Използвайте това:

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;

Това все още подлежи на SQL инжектиране в l_prefix , но ако контролирате тази стойност програмно, може да е ОК. Освен това разделянето на конструкцията на SQL и изпълнението на SQL на две стъпки ви позволява по-лесно да замените EXECUTE IMMEDIATE с DBMS_OUTPUT.PUT_LINE(SQL); за да проверите заявката си за синтактични грешки. Можете също да искате DBMS_OUTPUT.PUT_LINE вашите параметри i.CUSTOMER_REF_ID и i.CUSTOMER_ID за да проверите техните стойности.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - два месеца от днешната дата в Oracle

  2. jBPM 6.5 + Tomcat 8 + Bitronix Transaction + Oracle 11G конфигурация | Не можа да се ангажира сесия java.lang.NullPointerException

  3. Предаване на ClientInfo/ClientIdentifier на syscontext/връзка с Hibernate за целите на одита

  4. Борба с Spring SimpleJdbcCall за извикване на Oracle функция

  5. Задайте време за изчакване на връзката с база данни на Oracle 10g в Java