I have run into an odd issue, using oracle 9.2.0.4, and I am trying a
test based on the example in DBD::Oracle, using pipelined tables.  I
made a small test package:

/*

@TEST_PKG.SQL

SELECT * FROM TABLE (TEST_PKG.F_TEST(6));

var c refcursor
exec TEST_PKG.TEST1(6,:c);
exec TEST_PKG.TEST2(6,:c);
exec TEST_PKG.TEST3(6,:c);
exec TEST_PKG.TEST4(6,:c);

*/

CREATE OR REPLACE PACKAGE TEST_PKG AS

  TYPE CSR IS REF CURSOR;  

  TYPE TESTTYPE IS RECORD (FACILITY_NAME VARCHAR2(5),
                           FACILITY_ID NUMBER);
  TYPE TESTTABLE IS TABLE OF TESTTYPE;

  FUNCTION F_TEST (nCOUNT IN NUMBER) RETURN TESTTABLE PIPELINED;

  PROCEDURE TEST1 (nCOUNT IN NUMBER, cCURSOR OUT CSR);
  PROCEDURE TEST2 (nCOUNT IN NUMBER, cCURSOR OUT CSR);
  PROCEDURE TEST3 (nCOUNT IN NUMBER, cCURSOR OUT CSR);
  PROCEDURE TEST4 (nCOUNT IN NUMBER, cCURSOR OUT CSR);

END;
/
SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY TEST_PKG AS

  FUNCTION F_TEST (nCOUNT IN NUMBER) RETURN TESTTABLE PIPELINED AS
    nI NUMBER;    
    tTEST TESTTYPE;
  BEGIN
    nI:=0;
    FOR nI IN 1..nCOUNT LOOP
      tTEST.FACILITY_NAME:=TO_CHAR(nI);
      tTEST.FACILITY_ID:=nI;
      PIPE ROW (tTEST);
    END LOOP;
    RETURN;
  END;

  PROCEDURE TEST1 (nCOUNT IN NUMBER, cCURSOR OUT CSR) AS
  BEGIN
    OPEN cCURSOR FOR SELECT * FROM TABLE (TEST_PKG.F_TEST(6));
  END;

  PROCEDURE TEST2 (nCOUNT IN NUMBER, cCURSOR OUT CSR) AS
  BEGIN
    OPEN cCURSOR FOR SELECT * FROM TABLE (TEST_PKG.F_TEST(nCOUNT));
  END;

 PROCEDURE TEST3 (nCOUNT IN NUMBER, cCURSOR OUT CSR) AS
   vSQL VARCHAR2(1024):='SELECT * FROM TABLE (TEST_PKG.F_TEST(:1))';
 BEGIN
    OPEN cCURSOR FOR vSQL USING nCOUNT;
  END;

 PROCEDURE TEST4 (nCOUNT IN NUMBER, cCURSOR OUT CSR) AS
  vSQL VARCHAR2(1024);
 BEGIN
    vSQL:='SELECT * FROM TABLE (TEST_PKG.F_TEST('||nCOUNT||'))';
    OPEN cCURSOR FOR vSQL;
  END;

END;
/
SHOW ERRORS


For that package, TEST1 and TEST4 work, which lends to the problem I
am having on the perl side:

#!/usr/local/bin/perl

use DBInit;

my $DBH=DBInit::GetDatabaseHandle('DEV');

my $stmt1=$DBH->prepare('SELECT * FROM TABLE (TEST_PKG.F_TEST(6))');
$stmt1->execute();
my $h=$stmt1->fetchall_hashref('FACILITY_ID');
foreach (keys %{$h}){
    print "$_\n";
}

eval {
    my $stmt2=$DBH->prepare('SELECT * FROM TABLE (TEST_PKG.F_TEST(?))');
    $stmt2->execute(6);
    my $h=$stmt2->fetchall_hashref('FACILITY_ID');
    foreach (keys %{$h}){
        print "$_\n";
    }
};
print "[EMAIL PROTECTED]";

When I try and bind variable I get this.

DBD::Oracle::db prepare failed: 
ORA-22905: cannot access rows from a non-nested table item (DBD ERROR: 
OCIStmtExecute/Describe) [for statement ``SELECT * FROM TABLE (TEST_PKG.F_TEST(?))'']) 
at ./t.pl line 16.

I started investigate which lead to my TEST1-4, and discovered you
can't bind the variables inside either.  Am I doing something wrong?
Doesn't seem to be a usful tool if you can't pass in variables
effectivly.  

I can always make a static string for the call, but that seems more
like a work around, not a solution.


-- 
C Wayne Huling <[EMAIL PROTECTED]>

Reply via email to