sql >> Databáze >  >> RDS >> Oracle

Dynamická syntaxe SQL pomocí EXECUTE IMMEDIATE

UPOZORNĚNÍ :Dynamický SQL jako tento je náchylný k útokům SQL Injection. Kdykoli je to možné, přepište svůj dynamický SQL tak, aby místo toho používal proměnné vazby.

Namísto konstrukce dynamického SQL takto:

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;

Použijte toto:

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;

Toto je stále předmětem vkládání SQL v l_prefix , ale pokud tuto hodnotu ovládáte programově, může to být v pořádku. Také rozdělení konstrukce SQL a provádění SQL do dvou kroků vám umožní snadněji nahradit příkaz EXECUTE IMMEDIATE pomocí DBMS_OUTPUT.PUT_LINE(SQL); pro kontrolu syntaktických chyb v dotazu. Můžete také chtít DBMS_OUTPUT.PUT_LINE vaše parametry i.CUSTOMER_REF_ID a i.CUSTOMER_ID zkontrolovat jejich hodnoty.




  1. PHP MYSQL:okamžitý výběr + vložení

  2. Řazení výsledku dotazu podle pole z jiné tabulky (MySQL)

  3. odstranit duplicitní řádky na základě hodnoty jednoho sloupce

  4. odstranit nečíselné znaky ve sloupci (různé znaky), postgresql (9.3.5)