ssathak has asked for the wisdom of the Perl Monks concerning the following question:

There is a procedure as below in a database. What I need to do is to call this procedure from Perl script by passing values to all the parameters. I am able to pass values to all the parameters except parameter1 which is of record type. Please let me know how to pass values to the parameter which is of record type..

PROCEDURE retrieve ( parameter1 IN COMMON_RECORD, parameter2 IN NUMBER DEFAULT NULL, parameter3 IN VARCHAR2, parameter4 IN NUMBER, parameter5 OUT VARCHAR2, parameter6 OUT NUMBER, parameter7 OUT VARCHAR2) where COMMON_RECORD is a record as below. TYPE COMMON_RECORD IS RECORD ( temp1 VARCHAR2(512), temp2 VARCHAR(20), temp3 VARCHAR(10), temp4 VARCHAR(255) ); $stmt->bind_param(1, <...............>); $stmt->bind_param(2, 91); $stmt->bind_param(3, $amount); $stmt->bind_param(4, 1); $stmt->bind_param_inout(5, \$account, 50); $stmt->bind_param_inout(6, \$ecode, 50); $stmt->bind_param_inout(7, \$edesc, 500);

Replies are listed 'Best First'.
Re: Calling PL/SQL procedure with input as Record Type
by Eliya (Vicar) on Mar 07, 2012 at 13:48 UTC

    AFAIK, DBD::Oracle does not support binding record types.  You could either write a PL/SQL wrapper routine that takes individual varchar2 values (instead of the record) and assembles them into the record before calling the actual procedure.  Or maybe use an intermediary table — see Returning a Recordset for the general outline of the idea. Of course, this describes a somewhat different situation (output parameter, etc.), but it should in principle be adaptable...

    Personally, I usually use XML data structures (as CLOBs) to pass complex data between Perl and Oracle, as XML support is pretty good on both sides.

    If you can't modify the PL/SQL side, though, you're out of luck, I think.