一般的なPL/SQLプログラミングでは、SQLはDMLおよびトランザクション制御文で直接使用できますが、列名として適用されるパラメータを渡す必要がある新しいストアド・プロシージャの場合は、PL/SQLで直接使用できません。たとえば、設計された機能を実現したい場合は、動的 SQL を使用してそれを実現できます。
まず、動的 SQL とは何かを理解する必要があります。Oracle データベース開発の PL/SQL ブロックでは、使用する SQL は静的 SQL 文と動的 SQL 文に分けられます。いわゆる静的SQLとは、PL/SQLブロックで使用されるSQL文がコンパイル時に明確であり、何が実行されるかがオブジェクトを決定することを意味します。動的SQLとは、ユーザーが入力したパラメータに従って異なる操作を実行するなど、PL/SQLブロックのコンパイル時にSQL文が不確実であることを意味します。コンパイラは動的ステートメント部分を処理せず、プログラムの実行時にステートメントを動的に作成し、ステートメントの構文解析を実行して、ステートメントを実行するだけです。
Oracle の動的 SQL は、ローカル動的 SQL または DBMS_SQL パッケージを通じて実行できます。この記事では、SQL のローカルでの動的実行のみを紹介します。
Oracle バージョン 12 以降が適用されます。
動的SQL
drop package su1;
create or replace package su as
function get_id() return varchar2;
end su;
/
create or replace package body su1 as
function get_id() return varchar2
as
str_sql varchar2(200);
b varchar2(200);
begin
str_sql := 'select * from b1';
execute immediate str_sql into b;
return b;
end;
end su1;
/
select su1.get_id() from dual;
create or replace package su as
function get_id(tabname in varchar2) return varchar2;
end su;
/
create or replace package body su1 as
function get_id(tabname in varchar2) return varchar2
as
str_sql varchar2(200);
b varchar2(200);
begin
str_sql := 'select * from '||tabname||'';
execute immediate str_sql into b; --注意这里仅有一行数据返回
return b;
end;
end su1;
/
select su1.get_id(‘b1’) from dual;