#ifdef RCSID static char *RCSid = "$Header: obndra.c 7001200.1 92/12/20 17:46:18 twang Generic $ "; #endif /* RCSID */ /* Copyright (c) 1991 by Oracle Corporation */ /* NAME obndra.c - DESCRIPTION PUBLIC FUNCTION(S) PRIVATE FUNCTION(S) RETURNS NOTES MODIFIED (MM/DD/YY) rkooi2 11/28/92 - Creation */ /* Example program demonstrating an array insert using the obndra example from Chapter 4 of the OCI Programmer's Guide. */ #include #include #include #include Cda_Def cda; Lda_Def lda; /* set up the table */ text *dt = (text *) "DROP TABLE part_nos"; text *ct = (text *) "CREATE TABLE part_nos (partno NUMBER, description\ VARCHAR2(20))"; text *cp = (text *) "\ CREATE OR REPLACE PACKAGE update_parts AS\ TYPE part_number IS TABLE OF part_nos.partno%TYPE\ INDEX BY BINARY_INTEGER;\ TYPE part_description IS TABLE OF part_nos.description%TYPE\ INDEX BY BINARY_INTEGER;\ PROCEDURE add_parts (n IN INTEGER,\ descrip IN part_description,\ partno IN part_number);\ END update_parts;"; text *cb = (text *) "\ CREATE OR REPLACE PACKAGE BODY update_parts AS\ PROCEDURE add_parts (n IN INTEGER,\ descrip IN part_description,\ partno IN part_number) is\ BEGIN\ FOR i IN 1..n LOOP\ INSERT INTO part_nos\ VALUES (partno(i), descrip(i));\ END LOOP;\ END add_parts;\ END update_parts;"; #define DESC_LEN 20 #define MAX_TABLE_SIZE 1200 text *pl_sql_block = (text *) "\ BEGIN\ update_parts.add_parts(3, :description, :partno);\ END;"; text descrip[3][20] = {"Frammis", "Widget", "Thingie"}; sword numbers[] = {12125, 23169, 12126}; ub2 descrip_alen[3] = {DESC_LEN, DESC_LEN, DESC_LEN}; ub2 descrip_rc[3]; ub4 descrip_cs = (ub4) 3; ub2 descrip_indp[3]; ub2 num_alen[3] = {(ub2) sizeof (sword), (ub2) sizeof (sword), (ub2) sizeof (sword)}; ub2 num_rc[3]; ub4 num_cs = (ub4) 3; ub2 num_indp[3]; dvoid oci_error(void); main() { printf("Connecting to ORACLE..."); if (olon(&lda, "scott/tiger", -1, NULL, -1, -1)) { printf("Cannot logon as scott/tiger. Exiting...\n"); exit(1); } if (oopen(&cda, &lda, NULL, -1, -1, NULL, -1)) { printf("Cannot open cursor, exiting...\n"); exit(1); } /* Drop the table. */ printf("\nDropping table..."); if (oparse(&cda, dt, (sb4) -1, 0, (ub4) 2)) if (cda.rc != 942) oci_error(); printf("\nCreating table..."); if (oparse(&cda, ct, (sb4) -1, 0, (ub4) 2)) oci_error(); /* Parse and execute the create package statement. */ printf("\nCreating package..."); if (oparse(&cda, cp, (sb4) -1, 0, (ub4) 2)) oci_error(); if (oexec(&cda)) oci_error(); /* Parse and execute the create package body statement. */ printf("\nCreating package body..."); if (oparse(&cda, cb, (sb4) -1, 0, (ub4) 2)) oci_error(); if (oexec(&cda)) oci_error(); /* Parse the anonymous PL/SQL block that calls the stored procedure. */ printf("\nParsing PL/SQL block..."); if (oparse(&cda, pl_sql_block, (sb4) -1, 0, (ub4) 2)) oci_error(); /* Bind the C arrays to the PL/SQL tables. */ printf("\nBinding arrays..."); if (obndra(&cda, (text *) ":description", -1, (ub1 *) descrip, DESC_LEN, VARCHAR2_TYPE, -1, descrip_indp, descrip_alen, descrip_rc, (ub4) MAX_TABLE_SIZE, &descrip_cs, (text *) 0, -1, -1)) oci_error(); if (obndra(&cda, (text *) ":partno", -1, (ub1 *) numbers, (sword) sizeof (sword), INT_TYPE, -1, num_indp, num_alen, num_rc, (ub4) MAX_TABLE_SIZE, &num_cs, (text *) 0, -1, -1)) oci_error(); printf("\nExecuting block..."); if (oexec(&cda)) oci_error(); printf("\n"); if (oclose(&cda)) { printf("Error closing cursor!\n"); return -1; } if (ologof(&lda)) { printf("Error logging off!\n"); return -1; } exit(1); } dvoid oci_error(void) { text msg[600]; sword rv; rv = oerhms(&lda, cda.rc, msg, 600); printf("\n\n%.*s", rv, msg); printf("Processing OCI function %s\n", oci_func_tab[cda.fc]); if (oclose(&cda)) printf("Error closing cursor!\n"); if (ologof(&lda)) printf("Error logging off!\n"); exit(1); }