第一步 当然是建表了
example : -- create table 
drop table t_tname;
create table t_tname(xh   number(2),          -- 序号
    xm    varchar2(10),       -- 姓名
                    csrq  date,               -- 出生日期
                    bz    varchar2(100),      -- 备注
    constraint pk_t_tname primary key(xh));
下面都以表格 t_tname 为例第二步 就是实现功能了
打开form builder 前期准备工作
首先要有一个画布、窗口(假如将其名字名为cc_main,w_main)两者必须对应,然后就是添加数据块(就是选择你建立的表格)布局画面,按照提示一步一步完成了,最后将你需要实现什么功能添加功能按钮,放在另外一个非数据库块然后就是代码编写了。
1.WHEN-NEW-FORM-INSTANCE(进入FROM时执行) 所要做的就是初始化窗口和一些自己需要的查询
  1.1 将初始化窗口写成一个过程PROCEDURE Prc_Init_Windows ISBEGIN
  Set_Window_Property(Forms_Mdi_Window,TITLE,'WINDOW_NAME');      --设置多文档窗口标题
  Set_Window_Property(Forms_Mdi_Window,WINDOW_STATE,maximize);    --设置多文档窗口最大化
  Set_Window_Property('W_Main',WINDOW_STATE,maximize);            --设置主窗口最大化
  :System.Message_Level:='15';                                    --设置信息提示级别
END;
然后直接调用过程在WHEN-NEW-FORM-INSTANCE触发器里
-- code 
Prc_Init_Windows;
GO_BLOCK('t_tname');
SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_false);
SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);
execute_query;  -- 内置子程序执行查询(查询所有记录)2.添加 (所要做的就是保证序号不能为空,关键字)
两种操作方法一种直接在界面上输入,二种弹出另外一个窗口进行操作
就讲第一种吧,定义一个form参数p_xh (在对象导航器里面定义)
declare
  nXH NUMBER(2);
BEGIN  GO_BLOCK('t_tname');
  SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_TRUE);
  SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);
  last_record;
  create_record;
  select max(xh) into nXH from t_tname;
  :parameter.p_xh := nXH;
  :t_tname.xh := :parameter.p_xh;END;在t_tname数据块中添加WHEN-NEW-RECORD-INSTANCE触发器
  if get_block_property('t_tname',insert_allowed) = 'true' then
    if :t_tname.xh is null then
      :parameter.p_xh := :parameter.p_xh + 1;
      :t_tname.xh := :parameter.p_xh;
    end if;
  end if;3.修改
  GO_BLOCK('t_tname');
  IF :t_tname.XH IS NOT NULL THEN
    SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);
    SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_TRUE);
  END IF;4.删除
  
  GO_BLOCK('t_tname');
  IF :t_tname.XH IS NOT NULL THEN
    SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_true);
    delete_record;
    commit;
    SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_false);
  END IF;5.保存
  GO_BLOCK('t_tname');
  COMMIT;
  SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_FALSE);
  SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);
  SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_FALSE);6.撤消
DECLARE
  P_WHERE   VARCHAR2(200);
BEGIN
  GO_BLOCK('t_tname');   
  CLEAR_BLOCK(NO_COMMIT);
  P_WHERE := GET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE);
  SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);
  EXECUTE_QUERY;
END;7.查询以姓名和出生日期为字段进行查询,从新添加一个窗口和画布,一个查询非数据块(例如块名为BLK_QUERY)DECLPARE
  P_WHERE   VARCAHR2(200) := '1=1';
BEGIN
  IF :BLK_QUERY.XM IS NOT NULL THEN
    P_WHERE := P_WHERE||' AND XM = '||CHR(39)||:BLK_QUERY.XM||CHR(39);
  END IF;
  IF :BLK_QUERY.CSRY IS NOT NULL THEN
    P_WHERE := P_WHERE||' AND TO_CHAR(CSRY,''YYYYMMDD'') =     '||CHR(39)||TO_CHAR(:BLK_QUERY.CSRY,'YYYYMMDD')||CHR(39);
  END IF;  GO_BLOCK('t_tname');
  CLEAR_BLOCK(NO_VALIDATE);
  SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);
  EXECUTE_QUERY;
END;