运行脚本:
begin
xxx_plsql_generator_pkg2.form_view_iud_p(p_block_name =>'CONTRACT_T'
,p_table_name =>'WPC_Contract_T'
,p_owner =>'apps'
,p_primary_key =>'FConId');
end; select *
from all_tab_columns tc
where tc.table_name = upper('cux_dis_return_ifc')
and tc.owner = upper('apps')
and tc.column_name = upper('FConId');
执行脚本
调用的pckage:
create or replace package xxx_plsql_generator_pkg is
/*==================================================
Copyright (C) LYR Consulting Co., Ltd
All rights reserved
===================================================*/
-- Author : luoyuren
-- Created : 2010-12-07
-- Purpose : Auto Generat Plsql Code
g_exception exception; /****************************************************************** IN
p_block_name Form中数据块的名称
p_table_name 需要进行操作的数据表
p_owner 数据表的owner
p_primary_key 数据表的主键 DESCEIPTOIN
此过程主要用来生成基于视图的数据块常用触发器ON-INSERT,
ON-UPDATE,ON-DELETE,ON-LOCK之代码,使用时采用PL/SQL Developer
开发工具的的Test Windows,代码执行完成后会在DBMS Output标签页
中输出相关代码,使用时将代码Copy至Oralce Form Builder的Program
Units中,分为Package Spec和Package Body,并在相应触发器中加入相
应引用代码; ***************************************************************/
procedure form_view_iud_p(p_block_name in varchar2
,p_table_name in varchar2
,p_owner in varchar2
,p_primary_key in varchar2); end xxx_plsql_generator_pkg;
/
create or replace package body xxx_plsql_generator_pkg is
/*==================================================
Copyright (C) LYR Consulting Co., Ltd
All rights reserved
===================================================*/
g_output_first boolean := false;
g_cp_flag number; -- conc program
g_newline varchar2(1) := chr(10); type column_rec_type is record(
column_name varchar2(30),
nullable varchar2(1)); type column_tbl_type is table of column_rec_type index by binary_integer; procedure output_msg(p_msg_data in varchar2) is
begin
if g_output_first = false
then
g_cp_flag := fnd_profile.value('CONC_REQUEST_ID');
if g_cp_flag > 0
then
null;
else
dbms_output.enable(buffer_size => 20000000);
end if;
end if; if (g_cp_flag > 0)
then
fnd_file.put_line(fnd_file.log
,p_msg_data);
else
dbms_output.put_line(p_msg_data);
end if;
exception
when others then
null;
end output_msg; procedure form_view_iud_p(p_block_name in varchar2
,p_table_name in varchar2
,p_owner in varchar2
,p_primary_key in varchar2) is
cursor c_table is
select 'Y'
from all_tables t
where t.table_name = upper(p_table_name)
and t.owner = upper(p_owner); cursor c_tabcol is
select 'Y'
from all_tab_columns tc
where tc.table_name = upper(p_table_name)
and tc.owner = upper(p_owner)
and tc.column_name = upper(p_primary_key); cursor c_sequence is
select 'Y'
from all_objects ao
where ao.owner = p_owner
and ao.object_type = 'SEQUENCE'
and ao.object_name = upper(p_table_name) || '_S'; cursor c_columns is
select tc.column_name
,tc.nullable
from all_tab_columns tc
where tc.table_name = upper(p_table_name)
and tc.owner = upper(p_owner)
order by tc.column_id; l_dummy varchar2(1);
l_msg_data varchar2(4000);
l_package_name varchar2(100);
l_block_name_ext varchar2(50) := ':' || upper(p_block_name) || '.';
l_rec_ext varchar2(30) := 'rec.'; l_column_tbl column_tbl_type;
l_column_count number := 0; begin if (p_block_name is null) or
(p_table_name is null) or
(p_owner is null) or
(p_primary_key is null)
then
l_msg_data := 'Parameter not allow null !';
raise fnd_api.g_exc_error;
end if; -- check table exists
open c_table;
fetch c_table
into l_dummy;
if c_table%notfound
then
close c_table;
l_msg_data := 'Table ' || upper(p_table_name) || ' not found !';
raise fnd_api.g_exc_error;
end if;
close c_table; --check primary_key exists
open c_tabcol;
fetch c_tabcol
into l_dummy;
if c_tabcol%notfound
then
close c_tabcol;
l_msg_data := 'Table ' || upper(p_table_name) ||
' not exists column ' || upper(p_primary_key) || ' !';
raise fnd_api.g_exc_error;
end if;
close c_tabcol; --check sequence exists
/*Open c_sequence;
Fetch c_sequence
Into l_dummy;
If c_sequence%Notfound Then
Close c_sequence;
l_msg_data := 'Sequence ' || upper(p_block_name) || '_S not exists !';
Raise fnd_api.g_exc_error;
End If;
Close c_sequence;*/ -- get columns
for r in c_columns
loop
l_column_count := l_column_count + 1;
l_column_tbl(l_column_count).column_name := r.column_name;
l_column_tbl(l_column_count).nullable := r.nullable;
end loop; if l_column_count < 1
then
l_msg_data := 'Not column in table ' || p_table_name;
raise fnd_api.g_exc_error;
end if; l_package_name := upper(p_block_name) || '_PKG';
-- generate package special
l_msg_data := 'PACKAGE ' || l_package_name || ' IS' || g_newline ||
g_newline;
output_msg(l_msg_data); l_msg_data := '/*===============================================================' ||
g_newline ||
'* Copyright (C) LYR Consulting Co., Ltd All rights reserved' ||
g_newline ||
'* ===============================================================' ||
g_newline || '* Program Name:' || l_package_name; output_msg(l_msg_data); l_msg_data := '* Author :' || g_newline || '* Date :' ||
g_newline || '* Purpose :' || g_newline ||
'* Parameters :' || g_newline ||
'* Update History' || g_newline ||
'* Version Date Name Description' ||
g_newline ||
'* -------- ---------- --------------- --------------------'; output_msg(l_msg_data); l_msg_data := '* V1.0 Creation ' ||
g_newline || '*' || g_newline ||
' ===============================================================*/' ||
g_newline; output_msg(l_msg_data); l_msg_data := ' PROCEDURE insert_row;' || g_newline ||
' PROCEDURE lock_row;' || g_newline ||
' PROCEDURE update_row;' || g_newline ||
' PROCEDURE delete_row;' || g_newline || g_newline ||
'END ' || l_package_name || ';' || g_newline; output_msg(l_msg_data); -- generate package body
-- begin
l_msg_data := 'PACKAGE BODY ' || l_package_name || ' IS' || g_newline;
output_msg(l_msg_data); -- insert row /*
l_msg_data := '\*=====================================' || g_newline || '** PROCEDURE: insert_row()' || g_newline ||
'**=====================================*\' || g_newline || 'PROCEDURE insert_row IS' || g_newline;
*/ l_msg_data := '/*===============================================================' ||
g_newline || '* Program Name:insert_row()' ||
g_newline || '* Author :' || g_newline ||
'* Date :' || g_newline || '* Purpose :' ||
g_newline || '* Parameters :' || g_newline ||
'* In X --X的说明'; output_msg(l_msg_data); l_msg_data := '* Out Y --Y的说明' || g_newline ||
'* Update History' || g_newline ||
'* Version Date Name Description' ||
g_newline ||
'* -------- ---------- --------------- --------------------'; output_msg(l_msg_data); l_msg_data := '* V1.0 Creation ' ||
g_newline || '*' || g_newline ||
' ===============================================================*/' ||
g_newline || 'PROCEDURE insert_row IS'; output_msg(l_msg_data); l_msg_data := ' CURSOR row_id' || g_newline || ' IS SELECT ROWID' ||
g_newline || ' FROM ' || p_table_name || g_newline ||
' WHERE ' || p_primary_key || ' = ' ||
l_block_name_ext || p_primary_key || ';' || g_newline;
output_msg(l_msg_data); l_msg_data := 'BEGIN' || g_newline;
output_msg(l_msg_data); l_msg_data := ' fnd_standard.set_who;' || g_newline;
output_msg(l_msg_data); l_msg_data := ' IF ' || l_block_name_ext || p_primary_key ||
' IS NULL THEN' || g_newline || ' SELECT ' ||
upper(p_table_name) || '_S.NEXTVAL' || g_newline ||
' INTO ' || l_block_name_ext || p_primary_key ||
g_newline || ' FROM SYS.DUAL;' || g_newline ||
' END IF;' || g_newline;
output_msg(l_msg_data); l_msg_data := ' INSERT INTO ' || p_table_name || ' (';
output_msg(l_msg_data);
for i in 1 .. l_column_count
loop
if i = l_column_count
then
l_msg_data := ' ' || l_column_tbl(i).column_name || ')';
else
l_msg_data := ' ' || l_column_tbl(i).column_name || ',';
end if;
output_msg(l_msg_data);
end loop;
l_msg_data := ' VALUES (';
output_msg(l_msg_data);
for i in 1 .. l_column_count
loop
if i = l_column_count
then
l_msg_data := ' ' || l_block_name_ext || l_column_tbl(i)
.column_name || ');' || g_newline;
else
l_msg_data := ' ' || l_block_name_ext || l_column_tbl(i)
.column_name || ',';
end if;
output_msg(l_msg_data);
end loop; l_msg_data := ' OPEN row_id;' || g_newline || ' FETCH row_id INTO ' ||
l_block_name_ext || 'ROW_ID;' || g_newline ||
' IF (row_id%NOTFOUND) THEN' || g_newline ||
' CLOSE row_id;' || g_newline ||
' RAISE NO_DATA_FOUND;' || g_newline || ' END IF;' ||
g_newline || ' CLOSE row_id;' || g_newline;
output_msg(l_msg_data); l_msg_data := 'END insert_row;' || g_newline;
output_msg(l_msg_data); -- lock row --l_msg_data := '\*=====================================' || g_newline || '** PROCEDURE: lock_row()' || g_newline ||
-- '**=====================================*\' || g_newline || 'PROCEDURE lock_row IS' || g_newline; l_msg_data := '/*===============================================================' ||
g_newline || '* Program Name:lock_row()' || g_newline ||
'* Author :' || g_newline || '* Date :' ||
g_newline || '* Purpose :' || g_newline ||
'* Parameters :' || g_newline ||
'* In X --X的说明'; output_msg(l_msg_data); l_msg_data := '* Out Y --Y的说明' || g_newline ||
'* Update History' || g_newline ||
'* Version Date Name Description' ||
g_newline ||
'* -------- ---------- --------------- --------------------'; output_msg(l_msg_data); l_msg_data := '* V1.0 Creation ' ||
g_newline || '*' || g_newline ||
' ===============================================================*/' ||
g_newline || 'PROCEDURE lock_row IS'; output_msg(l_msg_data); l_msg_data := ' CURSOR c_row' || g_newline || ' IS SELECT *' ||
g_newline || ' FROM ' || p_table_name || g_newline ||
' WHERE rowid = ' || l_block_name_ext || 'ROW_ID' ||
g_newline || ' FOR UPDATE OF ' || p_primary_key ||
' NOWAIT;' || g_newline;
output_msg(l_msg_data); l_msg_data := ' rec c_row%rowtype;' || g_newline ||
' i NUMBER := 0;' || g_newline || 'BEGIN' || g_newline;
output_msg(l_msg_data); l_msg_data := ' LOOP' || g_newline || ' BEGIN';
output_msg(l_msg_data); l_msg_data := ' i := i + 1;' || g_newline || ' OPEN c_row;' ||
g_newline || ' FETCH c_row INTO rec;';
output_msg(l_msg_data); l_msg_data := ' IF (c_row%NOTFOUND) THEN' || g_newline ||
' CLOSE c_row;' || g_newline ||
' fnd_message.set_name(''FND'',''FORM_RECORD_DELETED'');' ||
g_newline || ' fnd_message.error;' || g_newline ||
' RAISE FORM_TRIGGER_FAILURE;';
output_msg(l_msg_data); l_msg_data := ' END IF;' || g_newline || ' CLOSE c_row;' ||
g_newline;
output_msg(l_msg_data); l_msg_data := ' IF (';
output_msg(l_msg_data);
for i in 1 .. l_column_count
loop
if i = 1
then
l_msg_data := ' ';
else
l_msg_data := ' AND ';
end if;
if l_column_tbl(i).column_name = p_primary_key
then
l_msg_data := l_msg_data || '(' || l_rec_ext || l_column_tbl(i)
.column_name || ' = ' || l_block_name_ext ||
l_column_tbl(i).column_name || ')';
else
l_msg_data := l_msg_data || '((' || l_rec_ext || l_column_tbl(i)
.column_name || ' = ' || l_block_name_ext ||
l_column_tbl(i)
.column_name || ') OR' || g_newline ||
' ((' || l_rec_ext || l_column_tbl(i)
.column_name || ' IS NULL)' || ' AND (' ||
l_block_name_ext || l_column_tbl(i)
.column_name || ' IS NULL)))';
end if;
output_msg(l_msg_data);
end loop; l_msg_data := ' ) THEN' || g_newline || ' RETURN;' ||
g_newline || ' ELSE' || g_newline ||
' fnd_message.set_name(''FND'', ''FORM_RECORD_CHANGED'');' ||
g_newline || ' fnd_message.error;' || g_newline ||
' RAISE FORM_TRIGGER_FAILURE;' || g_newline ||
' END IF;' || g_newline;
output_msg(l_msg_data); l_msg_data := ' EXCEPTION' || g_newline ||
' WHEN app_exception.record_lock_exception THEN' ||
g_newline ||
' app_exception.record_lock_error(i);' ||
g_newline || ' END;' || g_newline || ' END LOOP;' ||
g_newline;
output_msg(l_msg_data); l_msg_data := 'END lock_row;' || g_newline;
output_msg(l_msg_data); -- update row
l_msg_data := '/*===============================================================' ||
g_newline || '* Program Name:update_row()' ||
g_newline || '* Author :' || g_newline ||
'* Date :' || g_newline || '* Purpose :' ||
g_newline || '* Parameters :' || g_newline ||
'* In X --X的说明'; output_msg(l_msg_data); l_msg_data := '* Out Y --Y的说明' || g_newline ||
'* Update History' || g_newline ||
'* Version Date Name Description' ||
g_newline ||
'* -------- ---------- --------------- --------------------'; output_msg(l_msg_data); l_msg_data := '* V1.0 Creation ' ||
g_newline || '*' || g_newline ||
' ===============================================================*/' ||
g_newline || 'PROCEDURE update_row IS'; output_msg(l_msg_data); l_msg_data := 'BEGIN' || g_newline;
output_msg(l_msg_data);
l_msg_data := ' fnd_standard.set_who;' || g_newline;
output_msg(l_msg_data); l_msg_data := ' UPDATE ' || p_table_name || ' SET';
output_msg(l_msg_data);
for i in 1 .. l_column_count
loop
l_msg_data := ' ' || rpad(l_column_tbl(i).column_name
,30) || ' = ' || l_block_name_ext ||
l_column_tbl(i).column_name;
if i < l_column_count
then
l_msg_data := l_msg_data || ',';
end if;
output_msg(l_msg_data);
end loop;
l_msg_data := ' WHERE ROWID = ' || l_block_name_ext || 'ROW_ID;' ||
g_newline;
output_msg(l_msg_data); l_msg_data := ' IF (SQL%NOTFOUND) THEN' || g_newline ||
' RAISE NO_DATA_FOUND;' || g_newline || ' END IF;' ||
g_newline;
output_msg(l_msg_data); l_msg_data := 'END update_row;' || g_newline;
output_msg(l_msg_data); -- delete row --l_msg_data := '\*=====================================' || g_newline || '** PROCEDURE: delete_row()' || g_newline ||
-- '**=====================================*\' || g_newline || 'PROCEDURE delete_row IS'; l_msg_data := '/*===============================================================' ||
g_newline || '* Program Name:delete_row()' ||
g_newline || '* Author :' || g_newline ||
'* Date :' || g_newline || '* Purpose :' ||
g_newline || '* Parameters :' || g_newline ||
'* In X --X的说明'; output_msg(l_msg_data); l_msg_data := '* Out Y --Y的说明' || g_newline ||
'* Update History' || g_newline ||
'* Version Date Name Description' ||
g_newline ||
'* -------- ---------- --------------- --------------------'; output_msg(l_msg_data); l_msg_data := '* V1.0 Creation ' ||
g_newline || '*' || g_newline ||
' ===============================================================*/' ||
g_newline || 'PROCEDURE delete_row IS'; output_msg(l_msg_data); l_msg_data := 'BEGIN' || g_newline;
output_msg(l_msg_data); l_msg_data := ' DELETE FROM ' || p_table_name || g_newline ||
' WHERE ' || p_primary_key || ' = ' || l_block_name_ext ||
p_primary_key || ';' || g_newline;
output_msg(l_msg_data); l_msg_data := ' IF (SQL%NOTFOUND) THEN' || g_newline ||
' RAISE NO_DATA_FOUND;' || g_newline || ' END IF;' ||
g_newline;
output_msg(l_msg_data); l_msg_data := 'END delete_row;' || g_newline;
output_msg(l_msg_data); -- end
l_msg_data := 'END ' || l_package_name || ';';
output_msg(l_msg_data); exception
when fnd_api.g_exc_error then
output_msg(l_msg_data);
when others then
output_msg(sqlerrm);
end form_view_iud_p; end xxx_plsql_generator_pkg;
/