Presentation is loading. Please wait.

Presentation is loading. Please wait.

Dynamic SQL Oracle Database PL/SQL 10g Programming Chapter 13.

Similar presentations


Presentation on theme: "Dynamic SQL Oracle Database PL/SQL 10g Programming Chapter 13."— Presentation transcript:

1 Dynamic SQL Oracle Database PL/SQL 10g Programming Chapter 13

2 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 2 Dyanmic SQL Defining Dynamic SQL Defining Dynamic SQL Working with Native Dynamic SQL Working with Native Dynamic SQL Working with DBMS_SQL Built-in Working with DBMS_SQL Built-in

3 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 3 Dynamic SQL Defining Dynamic SQL Build and run SQL statements on the fly. Build and run SQL statements on the fly. Evaluates dependencies at runtime. Evaluates dependencies at runtime. Defines column and table names at runtime. Defines column and table names at runtime. Lets you define polymorphic statements. Lets you define polymorphic statements. Build dynamic SQL statements by using: Build dynamic SQL statements by using: Native Dynamic SQL (NDS) uses EXECUTE IMMEDIATE to run dynamic statements. Native Dynamic SQL (NDS) uses EXECUTE IMMEDIATE to run dynamic statements. DBMS_SQL Built-in provides a collection of overloaded functions and procedures to build and execute dynamic queries. DBMS_SQL Built-in provides a collection of overloaded functions and procedures to build and execute dynamic queries.

4 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 4 Dynamic SQL Native Dynamic SQL (NDS) Enables dynamic DDL and DML SQL statements without bind variables. Enables dynamic DDL and DML SQL statements without bind variables. Enables dynamic DML with a known list of bind variables. Enables dynamic DML with a known list of bind variables. Enables dynamic DQL. Enables dynamic DQL.

5 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 5 Dynamic SQL NDS Advantages It performs faster than DBMS_SQL. It performs faster than DBMS_SQL. It has syntax that mirrors standard SQL syntax. It has syntax that mirrors standard SQL syntax. It fetches directly into PL/SQL record types. It fetches directly into PL/SQL record types. It supports all PL/SQL data types, including user-defined data types. It supports all PL/SQL data types, including user-defined data types.

6 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 6 Dynamic SQL NDS Advantages It supports bulk processing: It supports bulk processing: BULK FETCH statement BULK FETCH statement BULK EXECUTE IMMEDIATE statement BULK EXECUTE IMMEDIATE statement FORALL statement FORALL statement COLLECT INTO clause COLLECT INTO clause RETURNING INTO clause RETURNING INTO clause %BULK_ROWCOUNT attribute %BULK_ROWCOUNT attribute

7 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 7 Dynamic SQL NDS: EXECUTE IMMEDIATE Clauses INTO INTO Mode is OUT only. Mode is OUT only. Supports only single row return statements. Supports only single row return statements. RETURNING INTO RETURNING INTO Modes are IN and OUT. Modes are IN and OUT. Supports name positional notation assigning variables to bind variables. Supports name positional notation assigning variables to bind variables. USING USING Modes are IN and OUT by itself. Modes are IN and OUT by itself. Mode is IN only when concurrently using RETURNING INTO clause. Mode is IN only when concurrently using RETURNING INTO clause. Supports only positional notation. Supports only positional notation.

8 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 8 Dynamic SQL NDS: Without bind variables DECLARE retval NUMBER; retval NUMBER; statement VARCHAR2(4000); statement VARCHAR2(4000);BEGIN statement := 'CREATE SEQUENCE ' || a_sequence || 'INCREMENT BY 1'; statement := 'CREATE SEQUENCE ' || a_sequence || 'INCREMENT BY 1'; EXECUTE IMMEDIATE statement; EXECUTE IMMEDIATE statement;END;/

9 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 9 Dynamic SQL NDS: Without substitution variables DECLARE retval NUMBER; retval NUMBER; sequence_name VARCHAR2(30) := 'sequence_name'; sequence_name VARCHAR2(30) := 'sequence_name'; statement VARCHAR2(4000); statement VARCHAR2(4000);BEGIN statement := 'CREATE SEQUENCE '||sequence_name||' ' statement := 'CREATE SEQUENCE '||sequence_name||' ' || 'INCREMENT BY 1'; || 'INCREMENT BY 1'; EXECUTE IMMEDIATE statement; EXECUTE IMMEDIATE statement;END;/

10 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 10 Dynamic SQL NDS: With bind variables DECLARE retval NUMBER; retval NUMBER; sequence_name VARCHAR2(30) := 'sequence_name'; sequence_name VARCHAR2(30) := 'sequence_name'; statement VARCHAR2(4000); statement VARCHAR2(4000);BEGIN statement := 'CREATE SEQUENCE :sequence_name ' statement := 'CREATE SEQUENCE :sequence_name ' || 'INCREMENT BY 1'; || 'INCREMENT BY 1'; EXECUTE IMMEDIATE statement USING sequence_name; EXECUTE IMMEDIATE statement USING sequence_name;END;/

11 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 11 Dynamic SQL NDS: With bind output variables DECLARE column_table1 VARCHAR2_NESTED_TABLE; column_table1 VARCHAR2_NESTED_TABLE; column_table2 VARCHAR2_NESTED_TABLE; column_table2 VARCHAR2_NESTED_TABLE;BEGIN statement := 'BEGIN ' statement := 'BEGIN ' || 'SELECT column_name1, column_name2 ' || 'SELECT column_name1, column_name2 ' || 'BULK COLLECT INTO :column_table ' || 'BULK COLLECT INTO :column_table ' || 'FROM table_name;' || 'FROM table_name;' || 'END;'; || 'END;'; EXECUTE IMMEDIATE statement EXECUTE IMMEDIATE statement USING OUT column_table1, OUT column_table2; USING OUT column_table1, OUT column_table2;END;/

12 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 12 Dynamic SQL DBMS_SQL Built-in Enables dynamic DDL and DML SQL statements without bind variables. Enables dynamic DDL and DML SQL statements without bind variables. Enables dynamic DML with a known list of bind variables. Enables dynamic DML with a known list of bind variables. Enables dynamic DQL. Enables dynamic DQL.

13 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 13 Dynamic SQL DBMS_SQL Built-in: Without bind variables DECLARE c INTEGER := DBMS_SQL.OPEN_CURSOR; c INTEGER := DBMS_SQL.OPEN_CURSOR; fdbk INTEGER; fdbk INTEGER; statement VARCHAR2(4000); statement VARCHAR2(4000);BEGIN statement := 'CREATE SEQUENCE ' || a_sequence statement := 'CREATE SEQUENCE ' || a_sequence || 'INCREMENT BY 1'; || 'INCREMENT BY 1'; DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); fdbk := DBMS_SQL.EXECUTE(c); fdbk := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); DBMS_SQL.CLOSE_CURSOR(c);END;/

14 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 14 Dynamic SQL DBMS_SQL Built-in: With bind variables DECLARE c INTEGER := DBMS_SQL.OPEN_CURSOR; c INTEGER := DBMS_SQL.OPEN_CURSOR; fdbk INTEGER; fdbk INTEGER; input VARCHAR2(30); input VARCHAR2(30); statement VARCHAR2(4000); statement VARCHAR2(4000);BEGIN statement := 'INSERT INTO a_table ' statement := 'INSERT INTO a_table ' || 'VALUES (:bind_variable)'; || 'VALUES (:bind_variable)'; DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); DBMS_SQL.BIND_VALUE(c,bind_variable,input); DBMS_SQL.BIND_VALUE(c,bind_variable,input); fdbk := DBMS_SQL.EXECUTE(c); fdbk := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); DBMS_SQL.CLOSE_CURSOR(c);END;/

15 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 15 Dynamic SQL DBMS_SQL Built-in: With bind array variables DECLARE c INTEGER := DBMS_SQL.OPEN_CURSOR; c INTEGER := DBMS_SQL.OPEN_CURSOR; fdbk INTEGER; fdbk INTEGER; input VARCHAR2_NESTED_TABLE; input VARCHAR2_NESTED_TABLE; statement VARCHAR2(4000); statement VARCHAR2(4000);BEGIN statement := 'INSERT INTO a_table ' statement := 'INSERT INTO a_table ' || 'VALUES (:bind_variable)'; || 'VALUES (:bind_variable)'; DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); DBMS_SQL.BIND_ARRAY(c,bind_variable,input); DBMS_SQL.BIND_ARRAY(c,bind_variable,input); fdbk := DBMS_SQL.EXECUTE(c); fdbk := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); DBMS_SQL.CLOSE_CURSOR(c);END;/

16 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 16 Dynamic SQL DBMS_SQL Built-in: With output bind variables DECLARE c INTEGER := DBMS_SQL.OPEN_CURSOR; c INTEGER := DBMS_SQL.OPEN_CURSOR; fdbk INTEGER; fdbk INTEGER; output VARCHAR2(4000); output VARCHAR2(4000); statement VARCHAR2(4000); statement VARCHAR2(4000);BEGIN statement := 'SELECT column_value FROM a_table'; statement := 'SELECT column_value FROM a_table'; DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); DBMS_SQL.PARSE(c,statement,DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(c,1,output,4000); DBMS_SQL.DEFINE_COLUMN(c,1,output,4000); … loop_on_next_page … … loop_on_next_page …END;/

17 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 17 Dynamic SQL DBMS_SQL Built-in: With output bind variables DECLARE … noted_on_prior_page … … noted_on_prior_page …BEGIN LOOP LOOP EXIT WHEN DBMS_SQL.FETCH_ROWS(c) = 0; EXIT WHEN DBMS_SQL.FETCH_ROWS(c) = 0; DBMS_SQL.COLUMN_VALUE(c,1,output); DBMS_SQL.COLUMN_VALUE(c,1,output); DBMS_OUTPUT.PUT_LINE('Print ['||output||']'); DBMS_OUTPUT.PUT_LINE('Print ['||output||']'); END LOOP; END LOOP;END;/

18 2006 Oracle Database PL/SQL 10g Programming (Chapter 13)Page 18 Summary Defining Dynamic SQL Defining Dynamic SQL Working with Native Dynamic SQL Working with Native Dynamic SQL Working with DBMS_SQL Built-in Working with DBMS_SQL Built-in


Download ppt "Dynamic SQL Oracle Database PL/SQL 10g Programming Chapter 13."

Similar presentations


Ads by Google