大剑
天天加班,哪有时间写博客 ---- 专注于ERP软件开发技术,关注Oracle相关技术

Oracle 存储过程返回多个值 3

2009年7月15日 06:18 in ORACLE tags: oracle 参数 返回值 in out

 

在Oracle中存储过程中,Function可以返回值,但只是一个
加入需要返回多个值,如果不用数组的话,可以用out参数,传出参数
有传出就有传入,in就是传入参数

以PB调用Oracle过程为例:

PL/SQL代码:
/*******************************************************************/
PROCEDURE p_example (ai_a IN NUMBER, ai_b OUT NUMBER, ai_c OUT NUMBER)
IS
    ll_count NUMBER;

BEGIN

    ll_count := 10;
    ai_b := ll_count + ai_a;
    ai_c := ll_count - ai_a;
   
 RETURN;
END;
/*******************************************************************/

PB代码:
/*******************************************************************/
long  ll_b
long  ll_c
long  ll_lan

ll_lan = 1

DECLARE p_pro PROCEDURE FOR p_example(:ll_lan);

EXECUTE p_pro ;
 if sqlca.sqlcode <> 0 then
  CLOSE p_pro ;
  return 1
 end if
 
 FETCH p_pro INTO :ll_b,:ll_c ;
 
 if sqlca.sqlcode = -1 then
  CLOSE p_pro ;
  return 1
 end if

CLOSE p_pro;
/*******************************************************************/

那么,ll_b,和ll_c里分别保存了存储过程返回的结果.


在PB中使用OLEObject操作Excel 2

2009年7月14日 06:15 in PB tags: PB OLE excel

在PB使用OLEObject操作Excel

1.申明和定义(其他变量定义省略)
 OLEObject  xlapp   // EXCEL application object
 OLEObject xlwk   // EXCEL workbook object
 OLEObject xlsub   // EXCEL worksheet object
 OLEObject xlcel   // EXCEL cell object

2.连接Excel文件,ls_path为Excel路径
 xlapp = create OLEObject
 
 li_ret = xlapp.ConnectToObject(ls_path)

 if li_ret < 0  then
  MessageBox("ERR","")
  destroy xlapp
 end if

3.打开Excel的workbook
 ll_cnt = xlapp.Application.Workbooks.Count //获取当前workbook的个数
 xlwk = xlapp.Application.Workbooks[ll_cnt] //打开最新的一个对象,也就是上面连接后打开的excel对象(如果改文件已经打开,需特殊考虑)
 xlsub = xlwk.Worksheets[1]
 xlapp.Application.Windows(ll_cnt).Visible = true //设置对象不可视
 
 xlsub.Activate
 
4.操作Excel的sheet
 //设置单元格背景颜色
 xlsub.cells(1,1).Interior.Color = rgb(255,0,0)
 xlsub.cells(1,1).Interior.Pattern = "1"
 
 //设置列的filter
 xlsub.Rows("1:1").AutoFilter
 
 //获取Excel行数
 ll_rowcnt_xls = xlsub.UsedRange.Rows.Count
 
 //设置Excel列宽自动大小(随内容宽度自动变化)
 xlsub.Rows("1:" + string(ll_rowcnt_xls)).Columns.AutoFit
 
 //sheet锁定, false:解锁; true:加锁
 xlsub.Cells.Locked = False
 
 //做一个下拉列表框,当选择DEL时候背景变成红色,选择NoAction无变化
 xlsub.Range(ls_range).Validation.Delete
 xlsub.Range(ls_range).Validation.Add("3", "1", "1", "NoAction,DEL")
 xlsub.Range(ls_range).Validation.IgnoreBlank = True
 xlsub.Range(ls_range).Validation.InCellDropdown = True
 xlsub.Range(ls_range).Validation.InputTitle = ""
 xlsub.Range(ls_range).Validation.ErrorTitle = ""
 xlsub.Range(ls_range).Validation.InputMessage = ""
 xlsub.Range(ls_range).Validation.ErrorMessage = ""
 xlsub.Range(ls_range).Validation.IMEMode(0)
 xlsub.Range(ls_range).Validation.ShowInput = True
 xlsub.Range(ls_range).Validation.ShowError = True
 
 xlsub.Range(ls_range).FormatConditions.Delete
 xlsub.Range(ls_range).FormatConditions.Add("1", "3", "DEL")
 xlsub.Range(ls_range).FormatConditions(1).Font.Color = rgb(255,0,0)
 
 //设置sheet单元格格式为文本格式
 xlsub.Cells.NumberFormatLocal = "@"
 
 // 设置保护,第一个参数是密码,后面的参数比较复杂,可以自己去一个一个实验
 xlsub.protect("password",true, true,true, false,false, false,false,true,true, false,true,true,false,true,false)
 
 //将sheet1的一列复制到sheet2中
 xlwk.Sheets("sheet1").Select()
 xlwk.Sheets("sheet1").Columns(ll_col_xls).Copy() // 要复制的列
 xlwk.Sheets("sheet2").Select()
 xlwk.Sheets("sheet2").Columns(ll_col_newsheet).Select() // 粘贴到ll_col_newsheet列前
 xlwk.Sheets("sheet2").Paste()
 
5.关闭Excel
 xlapp.Application.DisplayAlerts   =   False // 不提示保存等提示信息,且为不保存
 xlwk.save()
 xlwk.Close()
 
 xlapp.ConnectToObject(ls_path) //从新打开一个Excel对象
 ll_cnt = xlapp.Application.Workbooks.Count
 xlwk = xlapp.Application.Workbooks[ll_cnt]
 xlapp.Application.DisplayAlerts   =   True
 
 // -------------------------------------------
 // 上面关闭提示了,这里要解开关闭,否则其他woekbook关闭也没提示,
 //但是直接设置为true是不可以的(见下面两行代码),必须再打开一个对象,再设置为true才可以
 //xlapp.Application.DisplayAlerts   =   False
 //xlapp.Application.DisplayAlerts   =   True
 //--------------------------------------------
 
 xlwk.close()
 xlapp.DisConnectObject()
 
 Destroy xlsub
 Destroy xlwk
 Destroy xlapp
 
 其他一些简单的操作,网上有很多很好的资料,这里只是提到一些特殊的操作,例如:下拉列表框,选择条件,设置保护等等
 而这些也正是网上还不容易找到答案的.
 因为在Excel录制了宏之后,把宏放到PB里还是会出现很多问题,需要查阅资料以及自己的实验才能得出正确结果,
 希望对需要的人有帮助.


VB,VBA 利用数组向ORACLE传参 2

2009年2月03日 23:40 in ORACLE tags: AddTable VB VBA oracle 数组传参

起因:

         在对多条数据进行更新操作的时候,会频繁的调用INSERT和UPDATE语句,这样导致运行速度会很慢.

         ORACLE数据库提供了MERGE方法,大大加快了处理速度,而且只需做一次操作,但是如何将大批量数据传递给ORACLE呢?

解决办法:

         采用数组的形式,数据的每一列即为一个数组.

实例:   

  1. '定义部分
  2.  Const ORAPARM_INPUT = 1
  3.  Const ORATYPE_VARCHAR2 = 1
  4.  Dim OraPArray(4)
  5.  Dim lArrayIndex As Long
  6.  
  7. '数组大小
  8.  OraDB.Parameters.Add "inSize", 4, ORAPARM_INPUT
  9. '定义数组
  10. OraDB.Parameters.AddTable "HPL", ORAPARM_INPUT, ORATYPE_VARCHAR2, lDays, 5
  11.     ' caltype
  12. OraDB.Parameters.AddTable "CALTYPE", ORAPARM_INPUT, ORATYPE_VARCHAR2, lDays, 6
  13.     ' ymd
  14. OraDB.Parameters.AddTable "YMD", ORAPARM_INPUT, ORATYPE_VARCHAR2, lDays, 10
  15.     ' wkkbn :1,2
  16. OraDB.Parameters.AddTable "WKKBN", ORAPARM_INPUT, ORATYPE_VARCHAR2, lDays, 1
  17.  
  18. Set OraPArray(0) = OraDB.Parameters("HPL")
  19. Set OraPArray(1) = OraDB.Parameters("CALTYPE")
  20. Set OraPArray(2) = OraDB.Parameters("YMD")
  21. Set OraPArray(3) = OraDB.Parameters("WKKBN")
  22.  
  23. '数组赋值
  24. For li_row = 1 To 10000 
  25.         OraPArray(0).put_Value ls_Hpl, lArrayIndex
  26.         OraPArray(1).put_Value ls_calType, lArrayIndex
  27.         OraPArray(2).put_Value ls_ymd, lArrayIndex
  28.         OraPArray(3).put_Value ls_wkkbn, lArrayIndex
  29.        
  30.         lArrayIndex = lArrayIndex + 1
  31. Next
  32.      
  33.     ls_sql = " MERGE INTO F_ACTY.M0030 m0030 " & _
  34.              " USING (SELECT  :CALTYPE  caltype," & _
  35.                             " :YMD   ymd, " & _
  36.                             " :WKKBN  wkkbn, " & _
  37.                             " :HPL hpl " & _
  38.                      "FROM DUAL ) m0030b " & _
  39.              " ON (m0030.caltype = m0030b.caltype  and " & _
  40.                     " m0030.ymd =  m0030b.ymd and " & _
  41.                     " m0030.hpl =  m0030b.hpl ) " & _
  42.             " WHEN MATCHED THEN Update SET m0030.wkkbn = m0030b.wkkbn " & _
  43.             " WHEN NOT MATCHED THEN INSERT ( m0030.caltype, m0030.ymd, m0030.hpl,m0030.wkkbn ) " & _
  44.                                   " Values ( m0030b.caltype , m0030b.ymd ,m0030b.hpl , m0030b.wkkbn ) "
  45.     'Oracle DB处理
  46.     OraDB.ExecuteSQL (ls_sql)
  47.    
  48.     '消除
  49.     OraDB.Parameters.Remove "CALTYPE"
  50.     OraDB.Parameters.Remove "YMD"
  51.     OraDB.Parameters.Remove "WKKBN"
  52.     OraDB.Parameters.Remove "HPL"