Pro*C
Describe a database procedure and print its arguments
OEasy
2006. 12. 26. 15:34
/*-------------------------------------------------------------------- * Example Pro*C program to describe a database procedure and print * its arguments. * Frank Naude - Sep 2000 *-------------------------------------------------------------------- */ #define MAX_PLSQL_PARAMETERS 30 #include <stdlib.h> #include <stdio.h> #define SQLCA_INIT EXEC SQL INCLUDE sqlca; typedef char strz[31]; EXEC SQL TYPE strz IS STRING(31) REFERENCE; /* Declare functions */ int ora_logon(); int ora_logoff(); int ora_error(); int plsql_desc(char *procname); /*--------------------------------------------------------------------*/ int main() { ora_logon(); printf("About to describe procedure DBMS_OUTPUT.PUT_LINE...\n"); plsql_desc("DBMS_OUTPUT.PUT_LINE"); ora_logoff(); return 0; } /*-------------------------------------------------------------------- * Login to the Oracle database *--------------------------------------------------------------------*/ int ora_logon() { EXEC SQL BEGIN DECLARE SECTION; char *oracleid = "monitor/oramon"; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL CONNECT :oracleid; if (sqlca.sqlcode != 0) { printf("ERROR: Unable to login to Oracle\n%.*s", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc); } } /*-------------------------------------------------------------------- * Logoff from the Oracle database *--------------------------------------------------------------------*/ int ora_logoff() { EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL ALTER SESSION SET SQL_TRACE FALSE; EXEC SQL COMMIT WORK RELEASE; } /*-------------------------------------------------------------------- * Handle Oracle errors *--------------------------------------------------------------------*/ int ora_error() { char errmsg[2000]; unsigned int buf_len, msg_len; EXEC SQL WHENEVER SQLERROR CONTINUE; buf_len = sizeof(errmsg); sqlglm(errmsg, &buf_len, &msg_len); printf("Oracle Error: %.*s\n", msg_len, errmsg); exit(8); } /*-------------------------------------------------------------------- * Describe PL/SQL parameters *--------------------------------------------------------------------*/ int plsql_desc(char *procname) { int overload [MAX_PLSQL_PARAMETERS]; int position [MAX_PLSQL_PARAMETERS]; int level [MAX_PLSQL_PARAMETERS]; static strz argument_name [MAX_PLSQL_PARAMETERS]; static short arg_name_ind [MAX_PLSQL_PARAMETERS]; static int datatype [MAX_PLSQL_PARAMETERS]; int default_value [MAX_PLSQL_PARAMETERS]; int in_out [MAX_PLSQL_PARAMETERS]; int length [MAX_PLSQL_PARAMETERS]; int precision [MAX_PLSQL_PARAMETERS]; int scale [MAX_PLSQL_PARAMETERS]; int radix [MAX_PLSQL_PARAMETERS]; int spare [MAX_PLSQL_PARAMETERS]; int i = 0; int t = -1; /* Default return type is -1 */ for (i=0; i<MAX_PLSQL_PARAMETERS; i++) { overload[i] = -1; } EXEC SQL WHENEVER SQLERROR DO ora_error(); EXEC SQL EXECUTE BEGIN dbms_describe.describe_procedure(:procname, NULL, NULL, :overload, :position, :level, :argument_name:arg_name_ind, :datatype, :default_value, :in_out, :length, :precision, :scale, :radix, :spare); END; END-EXEC; /* The datatypes and their numeric type codes are: 0 placeholder for procedures with no arguments 1 VARCHAR, VARCHAR, STRING 2 NUMBER, INTEGER, SMALLINT, REAL, FLOAT, DECIMAL 3 BINARY_INTEGER, PLS_INTEGER, POSITIVE, NATURAL 8 LONG 11 ROWID 12 DATE 23 RAW 24 LONG RAW 96 CHAR (ANSI FIXED CHAR), CHARACTER 106 MLSLABEL 250 PL/SQL RECORD 251 PL/SQL TABLE 252 PL/SQL BOOLEAN */ /* Print parameters with types */ i = 0; while ((overload[i] != -1) && (i < MAX_PLSQL_PARAMETERS)) { printf ("pos=%d overl=%d ", position[i], overload[i]); if (arg_name_ind[i] != -1) { printf("nam=%s ", argument_name[i]); } printf("lev=%d typ=%d len=%d ", level[i],datatype[i],length[i]); printf("prec=%d scale=%d radix=%d\n",precision[i],scale[i],radix[i]); i++; } } /* EOF ****************************************************************/