I'd rather not go that way (I don't like solutions that require
mangling the sql in odd ways).

I think I'd rather optionally ignore placeholders named ':old' and ':new'.
Also, I think there was a patch floating around that optionally
disabled :foo style placeholders. That would also suffice.

Tim.

On Tue, Dec 04, 2001 at 04:19:13PM +0100, Flemming Frandsen wrote:
> 
> To create a trigger in SAP DB you use something like this:
> CREATE TRIGGER a_update FOR TEST.A AFTER UPDATE EXECUTE (
>   INSERT INTO TEST.changelog (oid) VALUES ( :old.string_field );
> )
> 
> The problem is that DBD::ODBC thinks that :old is a placeholder and it
> mangles the SQL because of it, clealy this is not good.
> 
> The patch allows you to use :: in stead of : and thus be able to pass a
> : to the dabase:
> CREATE TRIGGER a_update FOR TEST.A AFTER UPDATE EXECUTE (
>   INSERT INTO TEST.changelog (oid) VALUES ( ::old.string_field );
> )
> 
> Included in the patch is also a small fix to stop the driver from
> complaining about "SQLDriverConnect unsupported."
> 
> Here is the patch to appy to the latest version of DBD::ODBC (0.29):
> 
> --- orig/DBD-ODBC-0.29/dbdimp.c Thu Nov  8 10:48:01 2001
> +++ DBD-ODBC-0.29/dbdimp.c      Tue Dec  4 15:58:40 2001
> @@ -183,16 +183,15 @@
>       * and level 2+ just to indicate that we are trying SQLConnect.
>       */
>      if (!SQL_ok(rc)) {
> +       if (DBIS->debug > 3) {
>  #ifdef DBD_ODBC_NO_SQLDRIVERCONNECT
>         PerlIO_printf(DBILOGFP, "SQLDriverConnect unsupported.\n");
>  #else
> -       if (DBIS->debug > 3) {
>             PerlIO_printf(DBILOGFP, "SQLDriverConnect failed:\n");
>             AllODBCErrors(imp_dbh->henv, imp_dbh->hdbc, 0, 1);
> -       }
> -
>  #endif /* DriverConnect supported */
> -
> +       }
> +
>         if (DBIS->debug >= 2)
>             PerlIO_printf(DBILOGFP, "SQLConnect '%s', '%s', '%s'\n",
> dbname, uid, pwd);
> 
> @@ -499,7 +498,11 @@
>             *p = 0;
>             style = 2;
>         }
> -       else {                  /* perhaps ':=' PL/SQL construct */
> +       else if (ch == ':' && *src == ':') { /* :: -> : needed for sapdb
> triggers */
> +            *dest++ = *src++;
> +           continue;
> +       }
> +       else {                          /* perhaps ':=' PL/SQL construct
> */
>             *dest++ = ch;
>             continue;
>         }
> 
> 
> -- 
>  Regards Flemming Frandsen aka. Dion/Swamp http://dion.swamp.dk
> 
> On Tue, 4 Dec 2001, Flemming Frandsen wrote:
> 
> > On Tue, 4 Dec 2001, Fries Robert wrote:
> > 
> > > You can try the following statement:
> > > 
> > > CREATE TRIGGER a_update FOR TEST.A AFTER UPDATE EXECUTE (
> > >   INSERT INTO TEST.changelog (oid) VALUES (:OLD.string_field ));
> > 
> > > CREATE TRIGGER a_update FOR TEST.A AFTER UPDATE EXECUTE (
> > >   INSERT INTO TEST.changelog (oid) VALUES (:OLD.string_field );
> > > )
> > 
> > Ah!, I'm using the DBD:ODBC driver and it supports : style placeholders,
> > this means that it thinks that the :old.yadda_yadda is a placehodler and
> > it replaces it with something else before handing it to sapdb.
> > 
> > I'll need to teach the DBD::ODBC driver to not support : style
> > placeholders when you are creating a trigger, and I suspect, also when
> > creating stored procedures.
> > 
> > Sorry to have bothered you, thanks for your help, I'll write a fix for
> > DBD:SAPDB and post it here and on dbi-dev.
> > 
> > -- 
> >  Regards Flemming Frandsen aka. Dion/Swamp http://dion.swamp.dk
> > 
> > 
> 
> 

Reply via email to