Hello!
It would be great if I could do:
$sth->bind_param_inout(":mytable1", [EMAIL PROTECTED], 100, { TYPE =>
DBD::Oracle::ORA_VARCHAR2 } );
But autogenerated code from DBD prohibits array reference binds.
In DBD::Oracle there is an .xs file:
--------- Oracle.xs ----------
#include "Oracle.h"
DBISTATE_DECLARE;
MODULE = DBD::Oracle PACKAGE = DBD::Oracle
...
------------------------------
After processing, we get the following:
--------- Oracle.xsi ---------
void
bind_param_inout(sth, param, value_ref, maxlen, attribs=Nullsv)
SV * sth
SV * param
SV * value_ref
IV maxlen
SV * attribs
CODE:
{
IV sql_type = 0;
D_imp_sth(sth);
SV *value;
if (!SvROK(value_ref) || SvTYPE(SvRV(value_ref)) > SVt_PVMG)
croak("bind_param_inout needs a reference to a scalar value");
value = SvRV(value_ref);
if (SvREADONLY(value))
croak("Modification of a read-only value attempted");
if (SvGMAGICAL(value))
mg_get(value);
if (attribs) {
if (SvNIOK(attribs)) {
sql_type = SvIV(attribs);
attribs = Nullsv;
}
else {
SV **svp;
DBD_ATTRIBS_CHECK("bind_param", sth, attribs);
DBD_ATTRIB_GET_IV(attribs, "TYPE",4, svp, sql_type);
}
}
ST(0) = dbd_bind_ph(sth, imp_sth, param, value, sql_type, attribs, TRUE,
maxlen)
? &sv_yes : &sv_no;
}
------------------------------
But it would be great to bind arrays inout. What is the proper way to
allow array bind?
Should we change:
--- Oracle.xsi.orig Thu Sep 6 19:24:17 2007
+++ Oracle.xsi Thu Sep 6 19:27:27 2007
@@ -526,13 +526,21 @@
IV sql_type = 0;
D_imp_sth(sth);
SV *value;
- if (!SvROK(value_ref) || SvTYPE(SvRV(value_ref)) > SVt_PVMG)
- croak("bind_param_inout needs a reference to a scalar value");
+ if (!SvROK(value_ref) ||
+ (
+ (SvTYPE(SvRV(value_ref)) > SVt_PVMG) &&
+ (SvTYPE(SvRV(value_ref))!=SVt_PVAV )
+ )
+ )
+ croak("bind_param_inout needs a reference to a scalar or array value");
value = SvRV(value_ref);
if (SvREADONLY(value))
croak("Modification of a read-only value attempted");
if (SvGMAGICAL(value))
mg_get(value);
+ if(SvTYPE(SvRV(value_ref))==SVt_PVAV){
+ value=value_ref;
+ }
if (attribs) {
if (SvNIOK(attribs)) {
sql_type = SvIV(attribs);
Bye. Alex.