打印本文 打印本文 关闭窗口 关闭窗口
Result Sets from Stored Procedures In Oracle
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3126  更新时间:2009/4/22 22:10:39  文章录入:mintao  责任编辑:mintao
End Sub


  And now, for a full ASP example (thanks to Jim Hoien and John Durst )

<%@ Language=VBScript %>

<!--#INCLUDE VIRTUAL="/ADOVBS.INC" -->

<%

	'''' This demonstration draws heavily from the information contained in the article at
	'''' http://govt.us.oracle.com/~tkyte/ResultSets/index.html
	'''' with special attention to the details provided by Mark Tomlinson.
	'''' Make sure you have the correct Oracle ODBC driver so it will support Ref Cursors.
	''''
	''''
	'''' This demonstration was a joint project by Jim Hoien (jhoien@yahoo.com) and John Durst (jpdurst@yahoo.com)
	''''
	'''' These are the statements used on the Oracle server:
	''''
	'''' /*******************************************************************************************/
	'''' /* Create the EMP demo table and populate. (extracted from Oracle''''s provided demobld.sql)  */
	'''' /*******************************************************************************************/
	''''
	'''' CREATE TABLE EMP
	''''        (EMPNO NUMBER(4) NOT NULL,
	''''         ENAME VARCHAR2(10),
	''''         JOB VARCHAR2(9),
	''''         MGR NUMBER(4),
	''''         HIREDATE DATE,
	''''         SAL NUMBER(7,2),
	''''         COMM NUMBER(7,2),
	''''         DEPTNO NUMBER(2));
	'''' 
	'''' INSERT INTO EMP VALUES
	''''         (7369,''''SMITH'''',''''CLERK'''',7902,''''17-DEC-80'''',800,NULL,20);
	'''' INSERT INTO EMP VALUES
	''''         (7499,''''ALLEN'''',''''SALESMAN'''',7698,''''20-FEB-81'''',1600,300,30);
	'''' INSERT INTO EMP VALUES
	''''         (7521,''''WARD'''',''''SALESMAN'''',7698,''''22-FEB-81'''',1250,500,30);
	'''' INSERT INTO EMP VALUES
	''''         (7566,''''JONES'''',''''MANAGER'''',7839,''''2-APR-81'''',2975,NULL,20);
	'''' INSERT INTO EMP VALUES
	''''         (7654,''''MARTIN'''',''''SALESMAN'''',7698,''''28-SEP-81'''',1250,1400,30);
	'''' INSERT INTO EMP VALUES
	''''         (7698,''''BLAKE'''',''''MANAGER'''',7839,''''1-MAY-81'''',2850,NULL,30);
	'''' INSERT INTO EMP VALUES
	''''         (7782,''''CLARK'''',''''MANAGER'''',7839,''''9-JUN-81'''',2450,NULL,10);
	'''' INSERT INTO EMP VALUES
	''''         (7788,''''SCOTT'''',''''ANALYST'''',7566,''''09-DEC-82'''',3000,NULL,20);
	'''' INSERT INTO EMP VALUES
	''''         (7839,''''KING'''',''''PRESIDENT'''',NULL,''''17-NOV-81'''',5000,NULL,10);
	'''' INSERT INTO EMP VALUES
	''''         (7844,''''TURNER'''',''''SALESMAN'''',7698,''''8-SEP-81'''',1500,0,30);
	'''' INSERT INTO EMP VALUES
	''''         (7876,''''ADAMS'''',''''CLERK'''',7788,''''12-JAN-83'''',1100,NULL,20);
	'''' INSERT INTO EMP VALUES
	''''         (7900,''''JAMES'''',''''CLERK'''',7698,''''3-DEC-81'''',950,NULL,30);
	'''' INSERT INTO EMP VALUES
	''''         (7902,''''FORD'''',''''ANALYST'''',7566,''''3-DEC-81'''',3000,NULL,20);
	'''' INSERT INTO EMP VALUES
	''''         (7934,''''MILLER'''',''''CLERK'''',7782,''''23-JAN-82'''',1300,NULL,10);
	''''
	'''' /*******************************************************************************************/
	'''' /* Create a packaged procedure that accepts a department number and returns the employees. */
	'''' /*     [Note: A standalone procedure will not work, it must be a packaged procedure!]      */
	'''' /*******************************************************************************************/
	'''' 
	'''' CREATE OR REPLACE
	'''' PACKAGE DEPARTMENT AS
	''''   TYPE  CURSOR_TYPE IS REF CURSOR;
	''''   PROCEDURE GET_EMPS (I_DEPTNO     IN  NUMBER,
	''''                       O_RESULT_SET OUT CURSOR_TYPE);
	'''' END;
	'''' /
	'''' CREATE OR REPLACE
	'''' PACKAGE BODY DEPARTMENT AS
	''''   PROCEDURE GET_EMPS (I_DEPTNO     IN  NUMBER,
	''''                       O_RESULT_SET OUT CURSOR_TYPE)
	''''   AS
	''''   BEGIN
	''''     OPEN O_RESULT_SET FOR
	''''     SELECT EMPNO, ENAME
	''''     FROM EMP
	''''     WHERE DEPTNO = I_DEPTNO;
	''''   END;
	'''' END;
	'''' /

%>

<HTML>
<HEAD>
	<TITLE>Oracle ADO Test</TITLE>
</HEAD>
<BODY>

<H2>Test of ADO and Oracle Stored Procedures using Ref Cursors</H2>

<%

	Dim objConn
	Dim connString
	Dim cmdStoredProc
	Dim param1
	Dim testDeptNo
	

	testDeptNo = 10
''''	testDeptNo = 20
''''	testDeptNo = 30
	
			
	set objConn = server.createobject("adodb.connection")
	
	'''' System DSN connection
	'''' Replace the values below with your own
	connString = "DSN=<YourDSN>;UID=<YourUserName>;PWD=<YourPassword>"
	
	objConn.Open connString

	Set cmdStoredProc = Server.CreateObject ("ADODB.Command")
	Set cmdStoredProc.ActiveConnection = objConn
	cmdStoredProc.CommandText = "Department.Get_Emps"
	cmdStoredProc.CommandType = adCmdStoredProc
		
	Set param1 = cmdStoredProc.CreateParameter ("Dept_ID", adInteger, adParamInput)
	cmdStoredProc.Parameters.Append param1
	param1.Value = testDeptNo

	Set rs = cmdStoredProc.Execute

	Response.Write ("<h3>Employees in Department # " & testDeptNo & "</h3>" & vbCrLf)
	Response.Write ("<p>" & vbCrLf)

	Response.Write ("<table>" & vbCrLf)
	Response.Write ("	<tr>" & vbCrLf)
	Response.Write ("		<th>Emp #</th>" & vbCrLf)
	Response.Write ("		<th>Name</th>" & vbCrLf)
	Response.Write ("	</tr>" & vbCrLf)

	While (Not rs.EOF)
		Response.Write ("	<tr>" & vbCrLf)
		Response.Write ("		<td>" & rs (0) & "</td>" & vbCrLf)
		Response.Write ("		<td>" & rs (1) & "</td>" & vbCrLf)
		Response.Write ("	</tr>" & vbCrLf)
		
		rs.MoveNext
	Wend

	Response.Write ("</table>" & vbCrLf)

	rs.Close
	
	objConn.Close
			
	Set rs = nothing

	Set param1 = nothing

	Set cmdStoredProc = nothing

	Set objConn = nothing

%>

</BODY>
</HTML>

And the following is thanks to Brett Rosen :

I noticed that you didn''''t have an OCI entry
on http://osi.oracle.com/~tkyte/ResultSets/index.html .

Here is OCI code to do this (Oracle 81) if you want to include it on
that page.
Some error checking and cleanup has been removed, but the below should
work. (once dbname has been replaced appropriately)

    Brett

int main(int argc, char* argv[])
{
        OCIError*           pOciError;
        char*                   pConnectChar    = "dbname";
        char*                   pUsernameChar   = "scott";
        char*                   pPasswordChar   = "tiger";
        int                       answer;
        OCIStmt*           pOciStatement;
        char*                  sqlCharArray = "BEGIN :success := sp_ListEmp; END;";
        int                       id;
        char                    ename[40];
        OCIEnv*            g_pOciEnvironment = NULL;
        OCIServer*        g_pOciServer = NULL;
        OCISession*       g_pOciSession = NULL;
        OCISvcCtx*       g_pOciServiceContext = NULL;
        sb2*                    pIndicator=0;
        sb2*                    pIndicator2=0;
        sb2*                    pIndicator3=0;
        OCIDefine*         pOciDefine;
        OCIDefine*         pOciDefine2;
        OCIBind*            pBind;
        OCIStmt*            cursor;


        answer = OCIInitialize(OCI_THREADED, NULL, NULL, NULL, NULL);
        answer = OCIEnvInit(&g_pOciEnvironment, OCI_DEFAULT, 0, NULL);
        answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&pOciError, OCI_HTYPE_ERROR, 0, NULL);
        answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciSession, OCI_HTYPE_SESSION, 0, NULL);
        answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServer, OCI_HTYPE_SERVER, 0, NULL);
        answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServiceContext, OCI_HTYPE_SVCCTX, 0, NULL);
        answer = OCIServerAttach(g_pOciServer, pOciError, (unsigned char *)pConnectChar, strlen(pConnectChar),
                                 OCI_DEFAULT);
        answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pUsernameChar, strlen(pUsernameChar),
                            OCI_ATTR_USERNAME, pOciError);
        answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pPasswordChar, strlen(pPasswordChar),
                            OCI_ATTR_PASSWORD, pOciError);
        answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciServer, 0, OCI_ATTR_SERVER, pOciError);
        answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciSession, 0, OCI_ATTR_SESSION, pOciError);
        answer = OCISessionBegin(g_pOciServiceContext, pOciError, g_pOciSession, OCI_CRED_RDBMS, OCI_DEFAULT);
        answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&pOciStatement),  OCI_HTYPE_STMT, 0, NULL);
        answer = OCIStmtPrepare(pOciStatement, pOciError, (unsigned char *)sqlCharArray, strlen(sqlCharArray),
                                OCI_NTV_SYNTAX, OCI_DEFAULT);
        answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&cursor), OCI_HTYPE_STMT, 0, NULL);
        answer = OCIBindByPos(pOciStatement,&pBind, pOciError, 1, &cursor, 0,SQLT_RSET,
                                  pIndicator2, 0,NULL, 0,0,OCI_DEFAULT);

        answer = OCIStmtExecute(g_pOciServiceContext, pOciStatement, pOciError, 1, 0, NULL, NULL,
                                OCI_COMMIT_ON_SUCCESS);
        answer = OCIDefineByPos(cursor,&pOciDefine, pOciError,2,&id,sizeof(int),
                                SQLT_INT,pIndicator, 0, 0,OCI_DEFAULT);
       answer = OCIDefineByPos(cursor,&pOciDefine2, pOciError,1,ename,40,
                                SQLT_STR,pIndicator3, 0, 0,OCI_DEFAULT);

        if (answer == 0)
            while ((answer = OCIStmtFetch(cursor,pOciError, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0)
            {
                printf("fetched id %d and name %s\n",id,ename);
            }
        answer = OCIHandleFree(pOciError, OCI_HTYPE_ERROR);
        return 0

上一页  [1] [2] [3] [4]  下一页

打印本文 打印本文 关闭窗口 关闭窗口