| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: Dynamicaly OCIDefineByPos
The following code can give you a hint. And maybe you can solve my
problem!
Regards
Markus
1 //////////// start code fragment
/////////////////////////////////////
2 ...
3 ora_rc = OCIStmtPrepare( pOraStmt,
4 pOraError,
5 (text*)gszStmt,
6 strlen(gszStmt),
7 OCI_NTV_SYNTAX,
8 OCI_DEFAULT );
9 printf( "status after OCIStmtPrepare: " );
10 ORA_DispError( pOraError, ora_rc );
11 ora_rc = OCIStmtExecute( pOraService,
12 pOraStmt,
13 pOraError,
14 0, // iteration for non
SELECT calls
15 0,
16 NULL,
17 NULL,
18 0 );
19 printf( "status after OCIStmtExecute: " );
20 ORA_DispError( pOraError, ora_rc );
21 /* */
22 /* get statistic info */
23 /* */
24 ora_rc = OCIAttrGet( pOraStmt, OCI_HTYPE_STMT,
25 &nCols, NULL,
26 OCI_ATTR_PARAM_COUNT, pOraError );
27
28 ora_rc = OCIAttrGet( pOraStmt, OCI_HTYPE_STMT,
29 &nRows, NULL,
30 OCI_ATTR_ROW_COUNT, pOraError );
31 printf( "status after OCIAttrGet - OCI_ATTR_ROW_COUNT: " );
32 ORA_DispError( pOraError, ora_rc );
33 printf( "number of columns: %ld\n", nCols );
34 printf( "number of rows : %ld\n", nRows );
35 if ( nCols > MAX_COL_SUPPORTED )
36 {
37 printf( "panic, max Cols supported = %ld\n",
MAX_COL_SUPPORTED );
38 exit(1);
39 }
40 /* */
41 /* allocate some storage */
42 /* */
43 // allocate the bind buffers
44 for( ii=0; ii < nCols; ii++ )
45 {
46 ub4 nLen = 0;
47 ub1 nType = 0;
48 ub4 nSize = 0;
49 // get infos about the column
50 ora_rc = OCIParamGet( pOraStmt, OCI_HTYPE_STMT, pOraError,
51 &(colinfo[ii].pParamData), ii+1
);
52 // store col type
53 ora_rc = OCIAttrGet( colinfo[ii].pParamData,
OCI_DTYPE_PARAM,
54 &(colinfo[ii].col_type), 0,
55 OCI_ATTR_DATA_TYPE, pOraError );
56 // get required memory
57 ora_rc = OCIAttrGet( colinfo[ii].pParamData,
OCI_DTYPE_PARAM,
58 &(colinfo[ii].buf_len), 0,
59 OCI_ATTR_DATA_SIZE, pOraError );
60 // get col name
61 ora_rc = OCIAttrGet( colinfo[ii].pParamData,
OCI_DTYPE_PARAM,
62 (dvoid*)&(colinfo[ii].col_name),
&nSize,
63 OCI_ATTR_NAME, pOraError );
64 /* */
65 /* debug info */
66 /* */
67 // *(pszColName+nSize)=0;
68 printf( "size = %u\n", nSize );
69 printf( "datatype=%d, colname=%s, datasize=%u ",
70 colinfo[ii].col_type,
71 colinfo[ii].col_name,
72 colinfo[ii].buf_len );
73 printf( "loop OCIAttrGet: %d ", ii );
74 ORA_DispError( pOraError, ora_rc );
75 }
76 ...
77 //////////////////////// end code fragemnt
///////////////////////////
78 //////////////////////// start output
////////////////////////////////
79 start...
80 status after OCISessionBegin: OCI_SUCCESS
81 status after ORA_ServiceSetSession: OCI_SUCCESS
82 status after OCIStmtPrepare: OCI_SUCCESS
83 status after OCIStmtExecute: OCI_SUCCESS
84 status after OCIAttrGet - OCI_ATTR_ROW_COUNT: OCI_SUCCESS
85 number of columns: 4
86 number of rows : 0
87 size = 4
88 datatype=12, colname=DGEBID, datasize=7 loop OCIAttrGet: 0
OCI_SUCCESS
89 size = 2
90 datatype=2, colname=ID, datasize=22 loop OCIAttrGet: 1
OCI_SUCCESS
91 size = 4
92 datatype=96, colname=NAMEVNAME, datasize=30 loop OCIAttrGet: 2
OCI_SUCCESS
93 size = 5
94 datatype=1, colname=VNAME, datasize=30 loop OCIAttrGet: 3
OCI_SUCCESS
95 ### end ###
96 //////////////////////// end output
//////////////////////////////////
Christian Fruth wrote:
>
> Hi
>
> Here's my Problem:
> I want to write a c++-class which use
> OCI. The problem is that when an other programmer
> executes for example TOCI->Query("SELECT * FROM MYTABLE");
> my class don't know how many OCIDefineByPos it has to make.
> Also it doesn't know from which type the Cols are.
> Is there a Type like Variant ?
>
> The programmer should be possible to deside AFTER the Query
> which type he want's to use. For Example
> TOCI->FieldByName["Name"]->AsString().
> or
> TOCI->FieldByPos[5]->AsInteger().
>
> But i have no idea how to do that with OCI.
>
> Ciao
> Christian Fruth
Received on Thu Nov 12 1998 - 11:02:41 CST
![]() |
![]() |