Oracle Veritabanında Paket Yazan Paket
Oracle veritabanında bir tablo için otomatik olarak insert, update ve delete işlemlerini stored procedure olarak barındıran bir paket üretmek aşağıdaki kod bloğu ile mümkün.
create or replace package create_packages is
procedure p(pIn varchar2);
procedure create_package(pTable in varchar2,
pTableAlias in varchar2 default 'Data',
pPackageName in varchar2 default 'Pkt');
procedure create_package_spec(pTable in varchar2,
pTableAlias in varchar2 default 'Data',
pPackageName in varchar2);
procedure create_package_body(pTable in varchar2,
pTableAlias in varchar2 default 'Data',
pPackageName in varchar2);
procedure create_insert_spec(pTable in varchar2, pTableAlias in varchar2 default 'Data');
procedure create_insert_body(pTable in varchar2, pTableAlias in varchar2 default 'Data');
procedure create_update_spec(pTable in varchar2, pTableAlias in varchar2 default 'Data');
procedure create_update_body(pTable in varchar2, pTableAlias in varchar2 default 'Data');
procedure create_delete_spec(pTable in varchar2, pTableAlias in varchar2 default 'Data');
procedure create_delete_body(pTable in varchar2, pTableAlias in varchar2 default 'Data');
create or replace package body create_packages is
procedure p(pIn varchar2) is
dbms_output.put_line(pIn);
-- *********************************************
procedure create_package(pTable in varchar2,
pTableAlias in varchar2 default 'Data',
pPackageName in varchar2 default 'Pkt') is
create_package_spec(pTable, pTableAlias, pPackageName);
create_package_body(pTable, pTableAlias, pPackageName);
-- *********************************************
procedure create_package_spec(pTable in varchar2,
pTableAlias in varchar2 default 'Data',
pPackageName in varchar2) is
p('create package ' || pPackageName || pTable ||' is');
create_insert_spec(pTable, pTableAlias);
create_update_spec(pTable, pTableAlias);
create_delete_spec(pTable, pTableAlias);
p('end ' || pPackageName || pTable|| ' ;');
-- *********************************************
procedure create_package_body(pTable in varchar2,
pTableAlias in varchar2 default 'Data',
pPackageName in varchar2) is
p('create package body ' || pPackageName || pTable || ' is');
p(' -- Insert *********************************************');
create_insert_body(pTable, pTableAlias);
p(' -- Update *********************************************');
create_update_body(pTable, pTableAlias);
p(' -- Delete *********************************************');
create_delete_body(pTable, pTableAlias);
p('end ' || pPackageName || pTable || ' ;');
-- *********************************************
procedure create_insert_spec(pTable in varchar2, pTableAlias in varchar2 default 'Data') is
t.COLUMN_NAME || ' ' || T.DATA_TYPE || '(' || T.DATA_LENGTH || ');' colname_type_length,
t.COLUMN_NAME || ',' colname_comma,
':old.' || t.COLUMN_NAME || ',' colname_old,
':new.' || t.COLUMN_NAME || ',' colname_new,
t.COLUMN_NAME || '=p_' || t.COLUMN_NAME || ',' colname_pcolname,
'p_' || t.COLUMN_NAME || ',' pcolname_comma,
'p_' || t.COLUMN_NAME || ' IN ' || T.DATA_TYPE || ',' pcolname_in
where t.TABLE_NAME = upper(pTable);
p('procedure Insert' || pTableAlias || '(');
exit when curTable%notfound;
-- *********************************************
procedure create_insert_body(pTable in varchar2, pTableAlias in varchar2 default 'Data') is
t.COLUMN_NAME || ' ' || T.DATA_TYPE || '(' || T.DATA_LENGTH || ');' colname_type_length,
t.COLUMN_NAME || ',' colname_comma,
':old.' || t.COLUMN_NAME || ',' colname_old,
':new.' || t.COLUMN_NAME || ',' colname_new,
t.COLUMN_NAME || '=p_' || t.COLUMN_NAME || ',' colname_pcolname,
'p_' || t.COLUMN_NAME || ',' pcolname_comma,
'p_' || t.COLUMN_NAME || ' IN ' || T.DATA_TYPE || ',' pcolname_in
where t.TABLE_NAME = upper(pTable);
create_insert_spec(pTable, pTableAlias);
p('insert into ' || user || '.' || pTable || '(');
exit when curTable%notfound;
exit when curTable%notfound;
p(varTab.Pcolname_Comma);
p('end Insert' || pTableAlias || ' ;');
-- *********************************************
procedure create_update_spec(pTable in varchar2, pTableAlias in varchar2 default 'Data') is
t.COLUMN_NAME || ' ' || T.DATA_TYPE || '(' || T.DATA_LENGTH || ');' colname_type_length,
t.COLUMN_NAME || ',' colname_comma,
':old.' || t.COLUMN_NAME || ',' colname_old,
':new.' || t.COLUMN_NAME || ',' colname_new,
t.COLUMN_NAME || '=p_' || t.COLUMN_NAME || ',' colname_pcolname,
'p_' || t.COLUMN_NAME || ',' pcolname_comma,
'p_' || t.COLUMN_NAME || ' IN ' || T.DATA_TYPE || ',' pcolname_in
where t.TABLE_NAME = upper(pTable);
p('procedure Update' || pTableAlias || '(');
exit when curTable%notfound;
-- *********************************************
procedure create_update_body(pTable in varchar2, pTableAlias in varchar2 default 'Data') is
t.COLUMN_NAME || ' ' || T.DATA_TYPE || '(' || T.DATA_LENGTH || ');' colname_type_length,
t.COLUMN_NAME || ',' colname_comma,
':old.' || t.COLUMN_NAME || ',' colname_old,
':new.' || t.COLUMN_NAME || ',' colname_new,
t.COLUMN_NAME || '=p_' || t.COLUMN_NAME || ',' colname_pcolname,
'p_' || t.COLUMN_NAME || ',' pcolname_comma,
'p_' || t.COLUMN_NAME || ' IN ' || T.DATA_TYPE || ',' pcolname_in
where t.TABLE_NAME = upper(pTable);
create_update_spec(pTable, pTableAlias);
p('update ' || user || '.' || pTable);
exit when curTable%notfound;
where_sql := 'where ' || varTab.Column_Name || ' = ' ||
varTab.Pcolname_Comma || ';';
p(varTab.Column_Name || ' = ' || varTab.Pcolname_Comma);
p('end Update' || pTableAlias || ' ;');
-- *********************************************
-- *********************************************
procedure create_delete_spec(pTable in varchar2, pTableAlias in varchar2 default 'Data') is
t.COLUMN_NAME || ' ' || T.DATA_TYPE || '(' || T.DATA_LENGTH || ');' colname_type_length,
t.COLUMN_NAME || ',' colname_comma,
':old.' || t.COLUMN_NAME || ',' colname_old,
':new.' || t.COLUMN_NAME || ',' colname_new,
t.COLUMN_NAME || '=p_' || t.COLUMN_NAME || ',' colname_pcolname,
'p_' || t.COLUMN_NAME || ',' pcolname_comma,
'p_' || t.COLUMN_NAME || ' IN ' || T.DATA_TYPE || ',' pcolname_in
where t.TABLE_NAME = upper(pTable);
p('procedure Delete' || pTableAlias || '(');
exit when curTable%notfound;
-- *********************************************
procedure create_delete_body(pTable in varchar2, pTableAlias in varchar2 default 'Data') is
t.COLUMN_NAME || ' ' || T.DATA_TYPE || '(' || T.DATA_LENGTH || ');' colname_type_length,
t.COLUMN_NAME || ',' colname_comma,
':old.' || t.COLUMN_NAME || ',' colname_old,
':new.' || t.COLUMN_NAME || ',' colname_new,
t.COLUMN_NAME || '=p_' || t.COLUMN_NAME || ',' colname_pcolname,
'p_' || t.COLUMN_NAME || ',' pcolname_comma,
'p_' || t.COLUMN_NAME || ' IN ' || T.DATA_TYPE || ',' pcolname_in
where t.TABLE_NAME = upper(pTable);
create_delete_spec(pTable, pTableAlias);
p('delete from ' || user || '.' || pTable);
where_sql := 'where ' || varTab.Column_Name || ' = ' ||
varTab.Pcolname_Comma || ';';
p('end Delete' || pTableAlias || ' ;');
--------------------------------------------------------------------------------------------
Paketi oluşturduktan sonra create_package fonksiyonuna sağ tıklayıp test diyerek açılan test ekranında tablo adını, paket ve procedure'ler için alias vererek paketimizi oluşturabiliyoruz.
Paket çalıştığında oluşturduğu sonucu DBMS_Output sekmesine yazmaktadır. Buradaki sonucu kopyalayarak kullanabilirsiniz dikkat etmeniz gereken tek husus fonksiyonlarda yer alan parametre ve kolon adlarının sonunda var olan fazla virgülleri temizlemek gerekiyor.