1*b39c5158SmillertBEGIN { 2*b39c5158Smillert chdir 't' if -d 't/lib'; 3*b39c5158Smillert @INC = '../lib'; 4*b39c5158Smillert require Config; import Config; 5*b39c5158Smillert if ($Config{'extensions'} !~ /\bOS2(::|\/)REXX\b/) { 6*b39c5158Smillert print "1..0\n"; 7*b39c5158Smillert exit 0; 8*b39c5158Smillert } 9*b39c5158Smillert} 10*b39c5158Smillert 11*b39c5158Smillertuse OS2::REXX; 12*b39c5158Smillert 13*b39c5158Smillertsub stmt 14*b39c5158Smillert{ 15*b39c5158Smillert my ($s) = @_; 16*b39c5158Smillert $s =~ s/\s*\n\s*/ /g; 17*b39c5158Smillert $s =~ s/^\s+//; 18*b39c5158Smillert $s =~ s/\s+$//; 19*b39c5158Smillert return $s; 20*b39c5158Smillert} 21*b39c5158Smillert 22*b39c5158Smillertsub sqlcode 23*b39c5158Smillert{ 24*b39c5158Smillert OS2::REXX::_fetch("SQLCA.SQLCODE"); 25*b39c5158Smillert} 26*b39c5158Smillert 27*b39c5158Smillertsub sqlstate 28*b39c5158Smillert{ 29*b39c5158Smillert OS2::REXX::_fetch("SQLCA.SQLSTATE"); 30*b39c5158Smillert} 31*b39c5158Smillert 32*b39c5158Smillertsub sql 33*b39c5158Smillert{ 34*b39c5158Smillert my ($stmt) = stmt(@_); 35*b39c5158Smillert return 0 if OS2::REXX::_call("sqlexec", $sqlexec, "", $stmt); 36*b39c5158Smillert return sqlcode() >= 0; 37*b39c5158Smillert} 38*b39c5158Smillert 39*b39c5158Smillertsub dbs 40*b39c5158Smillert{ 41*b39c5158Smillert my ($stmt) = stmt(@_); 42*b39c5158Smillert return 0 if OS2::REXX::_call("sqldbs", $sqldbs, "", $stmt); 43*b39c5158Smillert return sqlcode() >= 0; 44*b39c5158Smillert} 45*b39c5158Smillert 46*b39c5158Smillertsub error 47*b39c5158Smillert{ 48*b39c5158Smillert my ($where) = @_; 49*b39c5158Smillert print "ERROR in $where: sqlcode=", sqlcode(), " sqlstate=", sqlstate(), "\n"; 50*b39c5158Smillert dbs("GET MESSAGE INTO :MSG LINEWIDTH 75"); 51*b39c5158Smillert my $msg = OS2::REXX::_fetch("MSG"); 52*b39c5158Smillert print "\n", $msg; 53*b39c5158Smillert exit 1; 54*b39c5158Smillert} 55*b39c5158Smillert 56*b39c5158SmillertREXX_call { 57*b39c5158Smillert 58*b39c5158Smillert $sqlar = DynaLoader::dl_load_file("h:/sqllib/dll/sqlar.dll") or die "load"; 59*b39c5158Smillert $sqldbs = DynaLoader::dl_find_symbol($sqlar, "SQLDBS") or die "find sqldbs"; 60*b39c5158Smillert $sqlexec = DynaLoader::dl_find_symbol($sqlar, "SQLEXEC") or die "find sqlexec"; 61*b39c5158Smillert 62*b39c5158Smillert sql(<<) or error("connect"); 63*b39c5158Smillert CONNECT TO sample IN SHARE MODE 64*b39c5158Smillert 65*b39c5158Smillert OS2::REXX::_set("STMT" => stmt(<<)); 66*b39c5158Smillert SELECT name FROM sysibm.systables 67*b39c5158Smillert 68*b39c5158Smillert sql(<<) or error("prepare"); 69*b39c5158Smillert PREPARE s1 FROM :stmt 70*b39c5158Smillert 71*b39c5158Smillert sql(<<) or error("declare"); 72*b39c5158Smillert DECLARE c1 CURSOR FOR s1 73*b39c5158Smillert 74*b39c5158Smillert sql(<<) or error("open"); 75*b39c5158Smillert OPEN c1 76*b39c5158Smillert 77*b39c5158Smillert while (1) { 78*b39c5158Smillert sql(<<) or error("fetch"); 79*b39c5158Smillert FETCH c1 INTO :name 80*b39c5158Smillert 81*b39c5158Smillert last if sqlcode() == 100; 82*b39c5158Smillert 83*b39c5158Smillert print "Table name is ", OS2::REXX::_fetch("NAME"), "\n"; 84*b39c5158Smillert } 85*b39c5158Smillert 86*b39c5158Smillert sql(<<) or error("close"); 87*b39c5158Smillert CLOSE c1 88*b39c5158Smillert 89*b39c5158Smillert sql(<<) or error("rollback"); 90*b39c5158Smillert ROLLBACK 91*b39c5158Smillert 92*b39c5158Smillert sql(<<) or error("disconnect"); 93*b39c5158Smillert CONNECT RESET 94*b39c5158Smillert 95*b39c5158Smillert}; 96*b39c5158Smillert 97*b39c5158Smillertexit 0; 98