Sdílet prostřednictvím


Spuštění příkazu

Existují čtyři způsoby spuštění příkazu v závislosti na tom, kdy jsou zkompilovány (připravené) databázovým strojem a kdo je definuje:

  • Přímé spuštění Aplikace definuje příkaz SQL. Je připraven a spuštěn za běhu v jednom kroku.

  • Připravené spuštění Aplikace definuje příkaz SQL. Je připravený a spouštěný za běhu programu v samostatných krocích. Příkaz lze připravit jednou a spustit vícekrát.

  • Postupy Aplikace může definovat a kompilovat jeden nebo více příkazů SQL v době vývoje a ukládat tyto příkazy do zdroje dat jako proceduru. Procedura se provádí jednou nebo vícekrát během spuštění. Aplikace může vytvořit výčet dostupných uložených procedur pomocí funkcí katalogu.

  • Funkce katalogu Autor ovladače vytvoří funkci, která vrátí předem definovanou množinu výsledků. Tato funkce obvykle odesílá předdefinovaný příkaz SQL nebo volá proceduru vytvořenou pro tento účel. Funkce se spouští jednou nebo vícekrát za běhu.

Konkrétní příkaz (identifikovaný popisovačem příkazu) lze provést libovolný počet. Tento příkaz lze provést s různými příkazy SQL nebo je možné ho spouštět opakovaně pomocí stejného příkazu SQL. Následující kód například používá stejný popisovač příkazu (hstmt1) k načtení a zobrazení tabulek v databázi Sales. Tento popisovač pak znovu použije k načtení sloupců v tabulce, kterou vybral uživatel.

SQLHSTMT    hstmt1;  
SQLCHAR *   Table;  
  
// Create a result set of all tables in the Sales database.  
SQLTables(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, NULL, 0, NULL, 0);  
  
// Fetch and display the table names; then close the cursor.  
// Code not shown.  
  
// Have the user select a particular table.  
SelectTable(Table);  
  
// Reuse hstmt1 to create a result set of all columns in Table.  
SQLColumns(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, Table, SQL_NTS, NULL, 0);  
  
// Fetch and display the column names in Table; then close the cursor.  
// Code not shown.  

Následující kód ukazuje, jak se jeden popisovač používá k opakovanému provedení stejného příkazu pro odstranění řádků z tabulky.

SQLHSTMT      hstmt1;  
SQLUINTEGER   OrderID;  
SQLINTEGER    OrderIDInd = 0;  
  
// Prepare a statement to delete orders from the Orders table.  
SQLPrepare(hstmt1, "DELETE FROM Orders WHERE OrderID = ?", SQL_NTS);  
  
// Bind OrderID to the parameter for the OrderID column.  
SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &OrderID, 0, &OrderIDInd);  
  
// Repeatedly execute hstmt1 with different values of OrderID.  
while ((OrderID = GetOrderID()) != 0) {  
   SQLExecute(hstmt1);  
}  

U mnoha ovladačů je přidělování příkazů nákladnou úlohou, takže opakované použití stejného příkazu tímto způsobem je obvykle efektivnější než uvolnění existujících příkazů a přidělování nových příkazů. Aplikace, které vytvářejí sady výsledků v příkazu, musí být opatrní, aby před opětovným spuštěním příkazu zavřely kurzor na sadu výsledků; Další informace naleznete v tématu Zavření kurzoru.

Opětovné použití příkazů také nutí aplikaci, aby obešla omezení počtu příkazů v některých ovladačích, které mohou být aktivní najednou. Přesná definice "aktivní" je specifická pro ovladač, ale často odkazuje na jakýkoli příkaz, který byl připraven nebo proveden a stále má k dispozici výsledky. Například po přípravě příkazu INSERT se obecně považuje za aktivní; po provedení příkazu SELECT a kurzor je stále otevřen, je obecně považován za aktivní; po provedení příkazu CREATE TABLE se obecně nepovažuje za aktivní.

Aplikace určuje, kolik příkazů může být aktivních na jednom připojení najednou voláním SQLGetInfo s možností SQL_MAX_CONCURRENT_ACTIVITIES. Aplikace může používat více aktivních příkazů, než je tento limit, otevřením více připojení ke zdroji dat; vzhledem k tomu, že připojení mohou být nákladná, je však třeba zvážit vliv na výkon.

Aplikace můžou omezit dobu přidělenou pro příkaz ke spuštění pomocí atributu příkazu SQL_ATTR_QUERY_TIMEOUT. Pokud časový limit vyprší před tím, než zdroj dat vrátí sadu výsledků, vrátí funkce, která spouští příkaz SQL, hodnotu SQLSTATE HYT00 (vypršel časový limit). Ve výchozím nastavení neexistuje žádný časový limit.

Tato část obsahuje následující témata.