当前位置:Linux教程 - Oracle - ORACLE应用经验(1)

ORACLE应用经验(1)

本文出自: 作者: (2001-08-13 07:00:00)
JAN-1(January) FEB-2(February) MAR-3(March)
APR-4(April) MAY-5(May) JUN-6(June)
JUL-7(July) AUG-8(August) SEP-9(September)
OCT-10(October) NOV-11(November) DEC-12(December)
********************************************************************
****************************常用设置********************************
---on-log 触发器编写示范
Declare
flag varchar2(80):=null;
cou number:=1;
n number;
Begin
Loop
logon(USERNAME,PASSWORD||''@''||CONNECT,PROPERTY_FALSE....);
flag:=Get_Application_Property(DATASOURCE);
Exit when cou>8 or flag=''ORACLE'';
cou:=cou+1;
End Loop;
If flag<>''ORACLE'' then
set_alert_property(''a_1'',alert_message_text,
''登录失败,请返回重试'');
n:=show_alert(''a_1'');
raise form_trigger_failure; --中断 FORM
End if;
End;
---对基表执行查询(只对基表)
Set_Block_Property(''Block_Name'',Default_Where,''where ......'');
Go_Block(''Block_Name'');
Execute_Query;
***************************************************
变量:
局部变量;
全局变量--------------1.:block.item
2.:parameter.v_name
3.:global.V_name

***************************************************
---同步发生显示
synchronize;
---实施''TRIGGER''触发
EXECUTE_TRIGGER(TRIGGER_NAME);
---清除模块
clear_block(NO_VALIDATE); ''NO_VALIDATE''不生效
--建立警告栏并由警告栏选择
Declare
n number;
Begin
Set_Alert_Property(''Alert_Name'',Alert_Message_Text,''message'');
n:=Show_Alert(''Alert_Name'');
If n=Alert_Button1 then
...;
ElsIf n=Alert_Button2 then
...;
End if;
End;
---WINDOW设置
--运行时最大化,最小化
Set_Window_Property(FORMS_MDI_WINDOW, WINDOW_STATE, MAXIMIZE|MINIMIZE);
--WINDOW标题
Set_Window_Property(FORMS_MDI_WINDOW, title,''TEXT'');
--退出是否为真
Set_Window_Property(FORMS_MDI_WINDOW, REMOVE_ON_EXIT,PROPERTY_FALSE|TRUE);
---设置系统提示信息等级
:System.Message_Level:= ''5|10|15|20'';
---设置ITEM属性
--设置ITEM属性ENABLED
Set_Item_Property(''Block_name.Item_name'',ENABLED,PROPERTY_TRUE|FALSE);
--设置ITEM属性NAVIGABLE
Set_Item_Property(''Block_name.Item_name'',NAVIGABLE,PROPERTY_TRUE|FALSE);
--设置ITEM属性VISUAL_ATTRIBUTE
Set_Item_Property(''Block_name.Item_name'',visual_attribute,''vname'');
--''vname''由导航器中(VISUAL_ATTRIBUTES)定义
--设置ITEM属性DISPLAYED
Set_Item_Property(''Block_name.Item_name'',displayed,TRUE|FALSE);
--设置ITEM属性POSITION
Set_Item_Property(''Block_name.Item_name'',position,x,y);
--设置ITEM_SIZE
Set_Item_Property(''Block_name.Item_name'',item_size,x,y);
--设置ITEM属性LABLE
Set_Item_Property(''Block_name.Item_name'',LABEL,''MESSAGE'')
---设置LIST ITEM示范
Declare
n number;
Begin
clear_list(''b1.fkfs'');
m:=populate_group(''fkfs'');
populate_list(''b1.fkfs'',''fkfs'');
/*
其中FKFS 为 record group ;
*/
End;
---增加''LIST ITEM''
Add_List_Element(list_name, list_index, list_label, list_value);
Add_List_Element(list_id, list_index, list_label, list_value);
---删除''LIST ITEM''项
Delete_List_Element(list_name, list_index);
Delete_List_Element(list_id, list_index);
例:
BEGIN
Delete_List_Element(''years'',1);
Add_List_Element(''years'', 1, ''1994'', ''1994'');
END;
---获得''LIST ITEM''项的组成
1.获得''LIST ITEM''的总和
GET_LIST_ELEMENT_COUNT(list_id);
GET_LIST_ELEMENT_COUNT(list_name);
2.获得''LIST ITEM''的标签
GET_LIST_ELEMENT_LABEL(list_id, list_name, list_index);
GET_LIST_ELEMENT_LABEL(list_name, list_index);

3.获得''LIST ITEM''的值
GET_LIST_ELEMENT_VALUE(list_id, list_index);
GET_LIST_ELEMENT_VALUE(list_name, list_index);

---设置''时间''
DECLARE
timer_id Timer;
one_minute NUMBER(5) := 60000;
BEGIN
timer_id := CREATE_TIMER(''emp_timer'', one_minute, REPEAT|NO_REPEAT);
END;
---产生一个''EDITER''框
DECLARE
ed_id Editor;
status BOOLEAN;
BEGIN
ed_id:=Find_Editor(''edit_name''); ---由''edit_name''导航器定义

IF NOT Id_Null(ed_id) THEN
Show_Editor(ed_id, NULL, :block_name.item_name, status);
ELSE
Message(''Editor ""Happy_Edit_Window"" not found'');
RAISE Form_Trigger_Failure;
END IF;
END;
----产生一个''LOV''框
DECLARE
lv_id LOV;
status BOOLEAN;
BEGIN
lv_id := Find_LOV(''lov_name''); ---''lov_name'' 由导航器定义
-- IF Id_Null(lv_id) THEN
-- lv_id := Find_LOV(''lov_name1''); ---''lov_name1'' 由导航器定义
-- END IF;
status := Show_LOV(lv_id,10,20);
END;
---定义一个''EXCEPTION''例外
Declare
err_1 exception;
Begin
If ... then
Raise err-1;
End if;
Exception
When err_1 then
....
END;
---设置应用特性(光标类型)
SET_APPLICATION_PROPERTY(CURSOR_STYLE,
''CROSSHAIR''|''BUSY''|''HELP''|''DEFAULT''|''INSERTION'');

***********************************************************************
**********************************函数*********************************
---把字符串的字符变成全大写(UPPER)全小写(LOWER)第一个字母大写(INITCAP)
UPPER|LOWER|INITCAP(STRING)
---在文件的左(''LPAD'')右(''RPAD'')粘贴字符
LPAD|RPAD(STRING,LENGTH,''SET'') ""LENGTH""为总字符长""SET""为粘贴字符
---在文件的左(''LTRIM'')右(''RTRIM'')删除字符
LTRIM|RTRIM(SRTING,''SET'') ""SET""为待删除字符
---找出''字符集''在字符串中的位置
INSTR(''STRING'',''SET'',N,M) 从''STRING''中找出''SET''从''N''位起第''M''个
---数的绝对值
ABS(VALUE)
---''MOD''模
MOD(VALUE,除数) 返回''除数''除''VALUE''的余数常用判断''VALUE''是否为整数
---把''VALUE''从''N''位四舍五入''ROUND'' 或从''N''位截断''TRUNC''
ROUND|TRUNC(VALUE,N)
---返回''VALUE''的符号
SIGN(VALUE)

---列表的最大值
GREATEST(N1,N1...);
列表的最小值
LEAST(N1,N1...);
---返回小于或等于数的最大整数
FLOOR(VALUE) floor(1.3)=1 floor(-1.3)=-2
---返回大于或等于数的最小整数
CEIL(VALUE) cell (1.3)=2 cell (-1.3)=-1

---取字符串长度
substr(string,start,number) number为string长度,start为string起点


---DECODE函数,多重(if,then,else)
decode(value,if1,then1,if2,then2,.....,else)
---判断''VALUE''是否为空(空值替换)
NVL(UALUE,''WKFHZ'') ''WKFHZ''是为空返回值,不为空则为原值
---字段长度
length(:block_name.item_id)
---返回字符串的第一(最左)个字符的ascII值
ascII(string)
---多行''VALUE''的 (作用于多''行'')
AVG(VALUE)平均值
COUNT(VALUE)行数
MAX(VALUE)最大值
MIN(VALUE)最小值
SUM(VALUE)和
---字符转换
TRANSLATE(STRING,''待转字符'',''转换字符'');
如 TEANSLATE(''AAABBB'',''AB'',''BA'') 返回''BBBAAA''

---比较单行中多个列的值获得最大(''GREATEST''最小(''LEAST'')
GREATEST|LEAST(列名,列名,...)
---按表达式或位置排序
ORDER BY ''表达式''OR''位置'' ASC|DESC ASC''升'',DESC''降'' 默认''ASC''
***********************************************************************
***********************************************************************
---游标的属性
(1) %ISOPEN 打开属性 布尔型 打开为TRUE
判断''光标''是否打开如未打开则打开''光标''
IF NOT(CORSOR_NAME%ISOPEN) THEN
OPEN CORSOR_NAME;
END IF;
FETCH CORSOR_NAME INTO ...
(2) %NOTFOUND 布尔型 最近一次''FETCH''返回无结果 则为TRUE
OPEN CORSOR_NAME;
LOOP
FETCH CORSOR_NAME INTO ...
EXIT WHEN CORSOR_NAEM%NOTFOUND;
END LOOP;
(3) %FOUND 布尔型 最近一次''FETCH''返回无结果 则为FALSE
OPEN CORSOR_NAME;

WHILE CORSOR_NAME%FOUND LOOP
......
FETCH CORSOR_NAME INTO ...
END LOOP;
CLOSE CORSOR_NAME;
(4) %ROWCOUNT NUMVER型 为游标取出的行数
OPEN CORSOR_NAME;
LOOP
FETCH CORSOR_NAME INTO ...
EXIT WHEN CORSOR_NAME%ROWCOUNT>5;
......
END LOOP;
CLOSE CORSOR_NAME;

---循环语句
(1)基本循环
LOOP
.....
EXIT WHILE; 如(EXIT WHEN X>100)
END LOOP;
(2)WHILE循环
WHILE 如( WHEN X>100) LOOP
.....
END LOOP;
(3)数值型FOR循环 ''X''为计数器
FOR X IN (第减值) Y..Z LOOP
.....
END LOOP;
(4)游标FOR循环


---Exception(例外)在最近的''BEGIN''和''END''之间
Exception
语法1 当''没有数据找到''时
when no_data_found then
语法2 当''发生任何错误''时
when others then
语法3 当''发现多行''时
WHEN TOO_MANY_ROWS THEN
语法4 当''字符向数字转换失败''时
WHEN INVALID_NUMBER THEN
语法5 当''被零除''时
WHEN ZERO_DIVIDE THEN
语法6 当''向唯一索引中插入重复数据''时
WHEN DUP_VAL_ON_INDEX THEN
语法7 当''非法游标操作''时
WHEN INVALID_CURSOR THEN
语法8 当''数字的,数据转换,截字符串或强制性的错误''时
WHEN VALUE_ERROR THEN
**************************************************************************
**************************************************************************
--常用TEXT_IO
Delcare
out_file text_io.file_type;
Begin
out_file:=text_io.fopen(''prn'',''w'');
text_io.new_line(out_file,'' '');
text_io.put_line(out_file,'' '')
text_io.fclose(out_file);
End;
---文本输入输出
TEXT_IO
TEXT_IO PACKAGE
TEXT_IO FCLOSE
TEXT_IO.FILE_TYPE
TEXT_IO.FOPEN
TEXT_IO.IS_OPEN
TEXT_IO.GET_LINE
TEXT_IO.NEW_LINE
TEXT_IO.PUT
TEXT_IO.PUTF
TEXT_IO.PUT_LINE
USING TEXT_IO CONSTRUCTS
----------------------------
Declare
Out_file Text_io.file_type;
L Varchar2(100);
L1 Varchar2(100);
L2 Varchar2(100);
Begin
Out_file :=text_io.fopen(''c:lllogin.txt'',''r'');
If text_io.is_open(Out_file) then
text_io.get_line(Out_file,L);
text_io.get_line(Out_file,L1);
text_io.get_line(Out_file,L2);
Else
Null;
End if;
End;
---清除全局变量
erase(''global.var_name'');
---隐藏''WINDOW'',''VIEW'',''MENU''
HIDE_WINDOW|VIEW|MENU(WINDOW|VIEW|MENU_name);
--- 增加参数add_parameter
Declare
pl_id ParamList;
BEGIN
pl_id:=Get_Parameter_List(''tempdata'');
IF NOT Id_Null(pl_id) THEN
Destroy_Parameter_List(pl_id);
END IF;
pl_id:=Create_Parameter_List(''tempdata'');
Add_Parameter(pl_id,''EMP_QUERY'',DATA_PARAMETER,''EMP_RECS'');
Run_Product(REPORTS,''empreport'',SYNCHRONOUS,RUNTIME,
FILESYSTEM,pl_id,NULL);
END;
---
DECLARE
lArgs OLE2.LIST_TYPE;
BEGIN
word.hApp:=OLE2.CREATE_OBJ(''Word.Basic'');
lArgs:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(lArgs,:ole.word_doc);
OLE2.INVOKE(Word.hApp,''fileopen'',lArgs);
OLE2.DESTROY_ARGLIST(lArgs);
END;
***********************删除重复记录**************
Delete from emp e
where e.rowid >
(select min(f.rowid) from emp f
4 where f.empno=e.empno);