Db2 : 使用樣本應用程式建立預存程序

來源:互聯網
上載者:User
使用樣本應用程式建立預存程序

本樣本使用名為 MYPROC() 的預存程序。這個過程採用 5 個參數:帳戶名稱、選項、轉帳金額、儲蓄餘額和支票餘額。以下列表標識每個參數的用途:

     帳戶名稱:用來標識帳戶的輸入參數。           選項:確定進行什麼操作的輸入參數。                    以下有三個選項:                  1:檢查餘額。                  2:從儲蓄帳戶向支票帳戶轉帳。                  3:從支票帳戶向儲蓄帳戶轉帳。  轉帳金額:要在支票帳戶和儲蓄帳戶之間轉帳的金額的輸入參數。  儲蓄餘額:返回儲蓄帳戶的餘額的輸出參數。  支票餘額:返回支票帳戶的餘額的輸出參數。

以下代碼構建預存程序:

SQL_API_RC SQL_API_FNmyProc(char * szName, int * nCmd, int * nAmount, int * nSaving,int * nChecking){SQLHENVhenv;SQLHDBChdbc;SQLHSTMThstmt;SQLRETURNrc;intnRetSize; SQLCHAR  str1[]="select saving, checking from db2e.myaccount where name = ?";SQLCHAR  str2[]="update db2e.myaccount set saving=saving - ?,           checking=checking + ? where name=?";SQLCHAR  str3[]="update db2e.myaccount set saving=saving + ?,           checking=checking - ? where name=?";//****************************************************************//* Prepare connection and statement//****************************************************************rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);//checkerrorrc = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc);//checkerrorrc = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, SQL_NTS);//checkerror    rc = SQLConnect(hdbc, NULL, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);//checkerrorrc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt);//checkerror    //****************************************************************//* Update account//****************************************************************if ( *nCmd == 2 || *nCmd == 3 ){if ( *nCmd == 2 ){ //Transfer from saving to checkingrc = SQLPrepare(hstmt, str2, SQL_NTS); //checkerror}if ( *nCmd == 3 ){ //Transfer from checking to savingrc = SQLPrepare(hstmt, str3, SQL_NTS); //checkerror}rc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,(SQLPOINTER)nAmount,0,NULL ); //checkerrorrc = SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,(SQLPOINTER)nAmount,0,NULL ); //checkerror rc = SQLBindParameter(hstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,(SQLPOINTER)szName,0,NULL ); //checkerrorrc = SQLExecute(hstmt); //checkerror} //****************************************************************//* Retrieve account balance//****************************************************************rc = SQLPrepare(hstmt, str1, SQL_NTS); //checkerrorrc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,(SQLPOINTER)szName,0,NULL); //checkerrorrc = SQLExecute(hstmt); //checkerrorif ( rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO ){while ( (rc = SQLFetch(hstmt) ) == SQL_SUCCESS ){rc = SQLGetData( hstmt,(SQLSMALLINT)1,SQL_C_LONG,nSaving,sizeof(int) ,&nRetSize ); //checkerrorrc = SQLGetData( hstmt,(SQLSMALLINT)2,SQL_C_LONG,nChecking,sizeof(int) ,&nRetSize ); //checkerror}}//****************************************************************//* Clean up//****************************************************************    rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT );     SQLFreeHandle(SQL_HANDLE_STMT, hstmt);SQLDisconnect(hdbc);SQLFreeHandle(SQL_HANDLE_DBC, hdbc);SQLFreeHandle(SQL_HANDLE_ENV, henv);return (0);} 

在 Win32 平台上,將預存程序構建成動態連結程式庫(mydll.dll)後,將其複製至 /SQLLIB/function 目錄。然後,註冊預存程序。

  1. 開啟 DB2 命令視窗。
  2. 使用以下命令串連至 MYSAMPLE 資料庫:
    DB2 CONNECT TO MYSAMPLE
  3. 使用名為 regscript.scr 的指令碼註冊預存程序以配置選項。下列代碼用於此指令碼:
    CREATE PROCEDURE db2e.MYPROC (IN szName CHAR(16),                               IN nCmd INTEGER,                               IN nAmount INTEGER,                               OUT nSaving INTEGER,                               OUT nChecking INTEGER )DYNAMIC RESULT SETS 1LANGUAGE C PARAMETER STYLE GENERAL NO DBINFOFENCEDMODIFIES SQL DATAPROGRAM TYPE SUBEXTERNAL NAME 'mydll!myProc'@

    要運行指令碼,輸入下列命令:

    db2 -td@ -vf regscript.scr

現在配置預存程序 db2e.MYPROC。接著,使用“行動裝置管理中心”建立預訂。

相關概念

----------------------------------------------------------------------------------------------------------

請教db2嵌c的預存程序 我寫了一個嵌c的預存程序sumuporg.sqc,將其先行編譯、綁定後產生sumuporg.c sumuporg.bnd。然後將sumuporg.c在microsoft vc下編譯產生sumuporg.dll,將該dll拷貝到d:/sqllib/function下(我的db2的安裝目錄)。
先行編譯過程如下:
connect to smns_ins user db2admin using db2admin@
prep d:/share/sumuporg.sqc bindfile using d:/share/sumuporg.bnd@
bind d:/share/sumuporg.bnd@
connect reset@

然後create預存程序:
create procedure sumuporg(in org char(21),in table char(9),in date char(21))
external name 'sumuporg!sumuporg'
language c
FENCED
parameter style general@

在strore procedure builder中執行該預存程序,錯誤資訊如下:
DB2ADMIN.SUMUPORG - 正在調用預存程序。
DB2ADMIN.SUMUPORG - 輸入參數的值:
ORG = 04
TABLE = A2
DATE = 2003/0/1/00/0/0/0/00
[IBM][CLI Driver][DB2/NT] SQL1106N 已裝入指定的 DLL "sumuporg" 模組,但是不能執行功能 "sumuporg"。
DB2ADMIN.SUMUPORG - 更改復原。
DB2ADMIN.SUMUPORG - 調用預存程序完成。

sumuporg.sqc內容如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "sql.h"
#include "sqlenv.h"

EXEC SQL INCLUDE SQLCA;

SQL_API_RC SQL_API_FN sumuporg(char *org,char *table,char *date)
{

EXEC SQL BEGIN DECLARE SECTION;
char inOrgCode[21];
char inTableCode[9];
char inDate[21];
char rowCode[10];
char columnCode[10];
char subOrgCode[21];
long lValue;
char sValue[31];
long lineCode;
EXEC SQL END DECLARE SECTION;

/*初始化*/
memset(inOrgCode,0,sizeof(inOrgCode));
memset(inTableCode,0,sizeof(inTableCode));
memset(inDate,0,sizeof(inDate));
strcpy(inOrgCode,org);
strcpy(inTableCode,table);
strcpy(inDate,date);

EXEC SQL DECLARE row CURSOR for
select FD_TARGET_CODE from tb_tem_target
where FD_TB_CODE=:inTableCode and FD_TARGET_KIND='H';

EXEC SQL DECLARE column CURSOR for
select FD_TARGET_CODE from tb_tem_target
where FD_TB_CODE=:inTableCode and FD_TARGET_KIND='L'
and FD_SUM='1';

EXEC SQL DECLARE org CURSOR for
select fd_code from tb_org
where fd_code like :inOrgCode||'__';

EXEC SQL OPEN row;

while(1){/*行指標*/

memset(rowCode,0,sizeof(rowCode));
EXEC SQL FETCH row INTO :rowCode;
if(sqlca.sqlcode==100){
EXEC SQL close row;
break;
}
else if(sqlca.sqlcode!=0){
EXEC SQL close row;
return(-1);
}

EXEC SQL OPEN column;

while(1){/*列指標*/

memset(columnCode,0,sizeof(columnCode));
EXEC SQL FETCH column INTO :columnCode;
if(sqlca.sqlcode==100){
EXEC SQL close column;
break;
}
else if(sqlca.sqlcode!=0){
EXEC SQL close column;
EXEC SQL close row;
return(-1);
}

lValue=0;

EXEC SQL OPEN org;

while(1){/*機構*/

memset(subOrgCode,0,sizeof(subOrgCode));
EXEC SQL FETCH org INTO :subOrgCode;
if(sqlca.sqlcode==100){
EXEC SQL close org;
break;
}
else if(sqlca.sqlcode!=0){
EXEC SQL close org;
EXEC SQL close column;
EXEC SQL close row;
return(-1);
}

memset(sValue,0,sizeof(sValue));

EXEC SQL select fd_value into :sValue from tb_datadic
where fd_date=:inDate and fd_orgcode=:subOrgCode
and fd_targetcode=:columnCode and fd_targetkindscode=:rowCode
and fd_tablecode=:inTableCode and fd_moneytype=1 and fd_flag='0';
if(sqlca.sqlcode!=0 && sqlca.sqlcode!=100){
EXEC SQL close org;
EXEC SQL close column;
EXEC SQL close row;
return(-1);
}

lValue+=atoi(sValue);

}/*end of 機構*/

/*如果數值不為0,則插入*/
if(lValue!=0){
lineCode=0;
EXEC SQL select fd_sortnum into :lineCode from tb_tem_target
where fd_tb_code=:inTableCode and fd_target_code=:rowCode;

memset(sValue,0,sizeof(sValue));
sprintf(sValue,"%d",lValue);

EXEC SQL insert into tb_datadic_tmp
values(:inDate,:inOrgCode,:columnCode,:rowCode,:lineCode,:inTableCode,:sValue,1,'2');
if(sqlca.sqlcode!=0){
EXEC SQL close column;
EXEC SQL close row;
return(-1);
}
}/*end of if(lValue!=0)*/

}/*end of 列指標*/

}/*end of 行指標*/

return(0);

}

請教各位,究竟是那個地方的問題?

-------------------------------------------------------------------1.15 C預存程序參數注意
create procedure pr_clear_task_ctrl(
IN IN_BRANCH_CODE char(4),
              IN IN_TRADEDATE   char(8),
           IN IN_TASK_ID     char(2),
       IN IN_SUB_TASK_ID char(4),
       OUT OUT_SUCCESS_FLAG INTEGER )
 
DYNAMIC RESULT SETS 0
LANGUAGE C 
PARAMETER STYLE GENERAL WITH NULLS(如果不是這樣,sql 的sp將不能調用該用c寫的預存程序,產生保護性錯誤)
NO DBINFO
FENCED
MODIFIES SQL DATA
EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.