sql >> Database >  >> RDS >> Oracle

Hoe een getalvariabele declareren waar ik de telling van de tabel in mijn lus kan opslaan?

Er zijn drie dingen mis met je dynamische SQL.

  1. IMMEDIATE UITVOEREN is geen functie:de juiste syntaxis is execute immediate '<<query>>' into <<variable>> .
  2. Een INSERT-instructie heeft een VALUES-clausule of een SELECT nodig, maar niet beide. SELECT zou in dit geval erg fout zijn. Houd er ook rekening mee dat het VALUES is en niet VALUE.
  3. COLUMN_NAME is een letterlijke tekenreeks in de dynamische SQL, dus het moet tussen aanhalingstekens staan. Maar omdat de SQL-instructie zelf een tekenreeks is, moeten aanhalingstekens in dynamische tekenreeksen worden ontsnapt, dus het zou `'''||column_name||''' moeten zijn.

Dus de gecorrigeerde versie ziet er ongeveer zo uit

declare
  Cursor C_TABLE  is 
    select trim(table_name) as table_name
      from all_tables
     where table_name in ('T1', 'T2', 'T3');

  V_ROWNUM number;

begin
    for m in C_TABLE
      loop 
          for i in ( select column_name 
                      from (
                          select c.column_name
                             from all_tab_columns c
                            where c.table_name = m.table_name 
                              and c.owner = 'owner1' 
                            )  
                    )       
     loop
         execute immediate 'select count(*) from ' || m.table_name into  V_ROWNUM;
         execute immediate 'insert into MY_table values ( ''' || i.column_name || ''', ' || V_ROWNUM || ')';

        end loop;
    end loop;
end;
/

Dynamische SQL is moeilijk omdat het compilatiefouten in runtime-fouten verandert. Het is een goede gewoonte om de instructies eerst als statische SQL te schrijven. Zodra u de basissyntaxis goed heeft, kunt u deze omzetten in dynamische SQL.



  1. Opgestelde verklaring over Postgresql in Rails

  2. Hoe groepeer ik een datumveld om kwartaalresultaten in MySQL te krijgen?

  3. Is SQL Server Bulk Insert transactioneel?

  4. Laravel-tijdstempels om milliseconden weer te geven