如何利用DBMS_SQL包執行動態SQL語句:
DECLARE
v_cursor NUMBER;
v_stat NUMBER;
v_row NUMBER;
v_id NUMBER;
v_no VARCHAR(100);
v_date DATE;
v_sql VARCHAR(200);
s_id NUMBER;
s_date DATE;
BEGIN
s_id := 3000;
s_date := SYSDATE;
v_sql := 'SELECT id,qan_no,sample_date FROM "tblno" WHERE id > :sid and sample_date < :sdate';
v_cursor := dbms_sql.open_cursor; --開啟遊標;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析動態SQL語句;
dbms_sql.bind_variable(v_cursor, ':sid', s_id); --繫結輸入引數;
dbms_sql.bind_variable(v_cursor, ':sdate', s_date);
dbms_sql.define_column(v_cursor, 1, v_id); --定義列
dbms_sql.define_column(v_cursor, 2, v_no, 100);
dbms_sql.define_column(v_cursor, 3, v_date);
v_stat := dbms_sql.execute(v_cursor); --執行動態SQL語句。
LOOP
EXIT WHEN dbms_sql.fetch_rows(v_cursor)<=0; --fetch_rows在結果集中移動遊標,如果未抵達末尾,返回1。
dbms_sql.column_value(v_cursor, 1, v_id); --將當前行的查詢結果寫入上面定義的列中。
dbms_sql.column_value(v_cursor, 2, v_no);
dbms_sql.column_value(v_cursor, 3, v_date);
dbms_output.put_line(v_id || ';' || v_no || ';' || v_date);
END LOOP;
dbms_sql.close_cursor(v_cursor); --關閉遊標。
END;
結果:
3095;S051013XW00010;15-10月-05
3112;A051013XW00027;10-10月-05
3113;A051013XW00028;13-10月-05
3116;S051013XW00031;13-10月-05
- CREATE OR REPLACE PROCEDURE copy (
- source IN VARCHAR2,
- destination IN VARCHAR2) IS
- id_var NUMBER;
- name_var VARCHAR2(30);
- birthdate_var DATE;
- source_cursor INTEGER;
- destination_cursor INTEGER;
- ignore INTEGER;
- BEGIN
-
- -- Prepare a cursor to select from the source table:
- source_cursor := dbms_sql.open_cursor;
- DBMS_SQL.PARSE(source_cursor,
- 'SELECT id, name, birthdate FROM ' || source,
- DBMS_SQL.native);
- DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
- DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
- DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, birthdate_var);
- ignore := DBMS_SQL.EXECUTE(source_cursor);
-
- -- Prepare a cursor to insert into the destination table:
- destination_cursor := DBMS_SQL.OPEN_CURSOR;
- DBMS_SQL.PARSE(destination_cursor,
- 'INSERT INTO ' || destination ||
- ' VALUES (:id_bind, :name_bind, :birthdate_bind)',
- DBMS_SQL.native);
-
- -- Fetch a row from the source table and insert it into the destination table:
- LOOP
- IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN
- -- get column values of the row
- DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
- DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
- DBMS_SQL.COLUMN_VALUE(source_cursor, 3, birthdate_var);
-
- -- Bind the row into the cursor that inserts into the destination table. You
- -- could alter this example to require the use of dynamic SQL by inserting an
- -- if condition before the bind.
- DBMS_SQL.BIND_VARIABLE(destination_cursor, ':id_bind', id_var);
- DBMS_SQL.BIND_VARIABLE(destination_cursor, ':name_bind', name_var);
- DBMS_SQL.BIND_VARIABLE(destination_cursor, ':birthdate_bind',
- birthdate_var);
- ignore := DBMS_SQL.EXECUTE(destination_cursor);
- ELSE
-
- -- No more rows to copy:
- EXIT;
- END IF;
- END LOOP;
-
- -- Commit and close all cursors:
- COMMIT;
- DBMS_SQL.CLOSE_CURSOR(source_cursor);
- DBMS_SQL.CLOSE_CURSOR(destination_cursor);
- EXCEPTION
- WHEN OTHERS THEN
- IF DBMS_SQL.IS_OPEN(source_cursor) THEN
- DBMS_SQL.CLOSE_CURSOR(source_cursor);
- END IF;
- IF DBMS_SQL.IS_OPEN(destination_cursor) THEN
- DBMS_SQL.CLOSE_CURSOR(destination_cursor);
- END IF;
- RAISE;
- END;
- /
複製代碼例如,动态SQL可以让你创建一个程序上的表的名称,直到运行时才知道。
|