运行脚本:

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;
/

自动生成form Scripts的更多相关文章

  1. 利用strut2标签自动生成form前端验证代码

    利用strut2标签自动生成form前端验证代码,使用到的技术有1.struts2标签,如<s:form> <s:textfieled>2.struts2读取*Validati ...

  2. 9.1.2 asp.net core 自动生成组合查询

    在做系统的时候,经常遇到前台录入一大堆的查询条件,然后点击查询提交后台,在Controller里面生成对应的查询SQL或者表达式,数据库执行再将结果返回客户端. 例如如下页面,输入三个条件,日志类型. ...

  3. PowerDesigner中表名过长,自动生成的主键名截取的问题

    在PowerDesinger中,若表名过长,自动生成的主键名会被自动截取. 解决如下:DataBase/Edit Current DBMS/Scripts/Objects/PKey/ConstName ...

  4. 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作

    在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界面看起来更加美观和协调.但是在系统中一般内置的图标样式相对比较有限,而且硬编码写到样式表里面,这 ...

  5. SpringMVC学习系列-后记 结合SpringMVC和Hibernate-validator,根据后台验证规则自动生成前台的js验证代码

    在SpringMVC学习系列(6) 之 数据验证中我们已经学习了如何结合Hibernate-validator进行后台的数据合法性验证,但是通常来说后台验证只是第二道保险,为了更好的用户体验会现在前端 ...

  6. FXForms,自动生成iOS表单

    1.简介 FXForms是一个简单的表单提交框架,他的作者是鼎鼎大名的 Nick Lockwood,你也许听说过他的其他的一些框架,比如 iCarousel. 为什么使用FxForms? 表单处理简单 ...

  7. 反射实体自动生成EasyUi DataGrid模板 第二版--附项目源码

    之前写过一篇文章,地址 http://www.cnblogs.com/Bond/p/3469798.html   大概说了下怎么通过反射来自动生成对应EasyUi datagrid的模板,然后贴了很多 ...

  8. 基于PHP和mysql的自动生成表单

    开发背景:公司要求管理系统能够由管理员在前台页面管理系统表单,能够对表单进行增删改查基本操作,表单的各个字段都可以被修改.删除,可以添加新的字段,并且不影响系统正常运行,前台表单展示要由系统自动处理, ...

  9. 自动生成 Lambda查询和排序,从些查询列表so easy

    如下图查询页面,跟据不同条件动态生成lambda的Where条件和OrderBy,如果要增加或调整查询,只用改前台HTML即可,不用改后台代码 前台代码: <div style="pa ...

随机推荐

  1. SQLAlchemy一对多总结

    1.SQLAlchemy之一对多关系 1.1 创建单表 class Test(Base): __tablename__ = 'user' nid = Colume(Integer,primary_ke ...

  2. UVA 247 电话圈 (floyd传递闭包 + dfs输出连通分量的点)

    题意:输出所有的环: 思路:数据比较小,用三层循环的floyd传递闭包(即两条路通为1,不通为0,如果在一个环中,环中的所有点能互相连通),输出路径用dfs,递归还没有出现过的点(vis),输出并递归 ...

  3. 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法

    苹果这狗日的,手段果然狠,因为用户提前升级了测试版又没有更新正式版,就突然把手机变砖头,既不让升级正式版,也不让备份手机中的信息,确实有必要这样吗? 我的手机是IPone4s,在看了6月Apple W ...

  4. node.js之windows下环境终极配置

    大家都知道现在node.js相当流行,出门在外,如果都没听说过node.js,基本上算是out了,前段时间做一个项目,用到了实时通讯功能,当时用的就是node.js来做的,我有幸有研究了一番,别的不敢 ...

  5. asp.net与asp.net 优缺点

    Asp.net Mvc架构模式是一种 低耦合.可测试的web应用程序框架,它是基于CLR和成熟的MVC架构构建的.ASP.NET MVC不支持ViewState和服务器控件. Asp.net优点: 1 ...

  6. 导出带图形的数据excel表

    public static string StatisticsSR(string parmStr) { try { StatisticsSRInfo parm = JsonConvert.Deseri ...

  7. TCP状态变迁流程

    主动建立TCP链接情况: 被动建立TCP链接情况 主动断开链接的情况 被动断开连接的情况 在TIME_WAIT阶段需要停留2倍的MSL,MSL即Maximum Segment Lifetime,表示任 ...

  8. OC 属性

    1 属性和实例变量 :属性 ==  实例变量声明 + setter 方法+ getter 方法 在老版本的 OC 语言中,我们需要同时声明属性和底层实例变量,那时,属性是 OC 语言的一个新的机制,并 ...

  9. Python变量、数据类型6

    1.Python变量 变量,即代表某个value的名字. 变量的值存储在内存中,这意味着在创建变量时会在内存中开辟一个空间. !!!即值并没有保存在变量中,它们保存在计算机内存的深处,被变量引用.所以 ...

  10. 导航position:absolute

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...