home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _d5d3796c333924cebf098bc2da7c8da0 < prev    next >
Text File  |  2000-03-23  |  34KB  |  685 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>DBD::Sybase - Sybase database driver for the DBI module</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> DBD::Sybase - Sybase database driver for the DBI module</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <LI><A HREF="#connecting to sybase">Connecting to Sybase</A></LI>
  26.     <UL>
  27.  
  28.         <LI><A HREF="#the interfaces file">The interfaces file</A></LI>
  29.         <LI><A HREF="#specifying the server name">Specifying the server name</A></LI>
  30.         <LI><A HREF="#specifying other connection specific parameters">Specifying other connection specific parameters</A></LI>
  31.     </UL>
  32.  
  33.     <LI><A HREF="#handling multiple result sets">Handling Multiple Result Sets</A></LI>
  34.     <LI><A HREF="#$sth>execute() failure mode behavior">$sth-><CODE>execute()</CODE> failure mode behavior</A></LI>
  35.     <LI><A HREF="#sybase specific attributes">Sybase Specific Attributes</A></LI>
  36.     <UL>
  37.  
  38.         <LI><A HREF="#database handle attributes">Database Handle Attributes</A></LI>
  39.         <LI><A HREF="#statement handle attributes">Statement Handle Attributes</A></LI>
  40.     </UL>
  41.  
  42.     <LI><A HREF="#controlling datetime output formats">Controlling DATETIME output formats</A></LI>
  43.     <LI><A HREF="#retrieving output parameters from stored procedures">Retrieving OUTPUT parameters from stored procedures</A></LI>
  44.     <LI><A HREF="#multiple active statements on one $dbh">Multiple active statements on one $dbh</A></LI>
  45.     <LI><A HREF="#image and text datatypes">IMAGE and TEXT datatypes</A></LI>
  46.     <LI><A HREF="#autocommit, transactions and transactsql">AutoCommit, Transactions and Transact-SQL</A></LI>
  47.     <LI><A HREF="#using  placeholders & bind parameters to $sth>execute">Using ? Placeholders & bind parameters to $sth->execute</A></LI>
  48.     <LI><A HREF="#bugs">BUGS</A></LI>
  49.     <LI><A HREF="#see also">SEE ALSO</A></LI>
  50.     <LI><A HREF="#author">AUTHOR</A></LI>
  51.     <LI><A HREF="#copyright">COPYRIGHT</A></LI>
  52.     <LI><A HREF="#acknowledgements">ACKNOWLEDGEMENTS</A></LI>
  53. </UL>
  54. <!-- INDEX END -->
  55.  
  56. <HR>
  57. <P>
  58. <H1><A NAME="name">NAME</A></H1>
  59. <P>DBD::Sybase - Sybase database driver for the DBI module</P>
  60. <P>
  61. <HR>
  62. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  63. <UL>
  64. <LI>Windows</LI>
  65. </UL>
  66. <HR>
  67. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  68. <PRE>
  69.     use DBI;</PRE>
  70. <PRE>
  71.     $dbh = DBI->connect("dbi:Sybase:", $user, $passwd);</PRE>
  72. <PRE>
  73.     # See the DBI module documentation for full details</PRE>
  74. <P>
  75. <HR>
  76. <H1><A NAME="description">DESCRIPTION</A></H1>
  77. <P>DBD::Sybase is a Perl module which works with the DBI module to provide
  78. access to Sybase databases.</P>
  79. <P>
  80. <HR>
  81. <H1><A NAME="connecting to sybase">Connecting to Sybase</A></H1>
  82. <P>
  83. <H2><A NAME="the interfaces file">The interfaces file</A></H2>
  84. <P>The DBD::Sybase module is built on top of the Sybase <EM>Open Client Client 
  85. Library</EM> API. This library makes use of the Sybase <EM>interfaces</EM> file
  86. (<EM>sql.ini</EM> on Win32 machines) to make a link between a logical
  87. server name (e.g. SYBASE) and the physical machine / port number that
  88. the server is running on. The OpenClient library uses the environment
  89. variable <STRONG>SYBASE</STRONG> to find the location of the <EM>interfaces</EM> file,
  90. as well as other files that it needs (such as locale files). The <STRONG>SYBASE</STRONG>
  91. environment is the path to the Sybase installation (eg '/usr/local/sybase').
  92. If you need to set it in your scripts, then you <EM>must</EM> set it in a
  93. <CODE>BEGIN{}</CODE> block:</P>
  94. <PRE>
  95.    BEGIN {
  96.        $ENV{SYBASE} = '/opt/sybase/11.0.2';
  97.    }</PRE>
  98. <PRE>
  99.    $dbh = DBI->connect('dbi:Sybase:', $user, $passwd);</PRE>
  100. <P>
  101. <H2><A NAME="specifying the server name">Specifying the server name</A></H2>
  102. <P>The server that DBD::Sybase connects to defaults to <EM>SYBASE</EM>, but
  103. can be specified in two ways.</P>
  104. <P>You can set the <EM>DSQUERY</EM> environement variable:</P>
  105. <PRE>
  106.     $ENV{DSQUERY} = "ENGINEERING";
  107.     $dbh = DBI->connect('dbi:Sybase:', $user, $passwd);</PRE>
  108. <P>Or you can pass the server name in the first argument to connect():</P>
  109. <PRE>
  110.     $dbh = DBI->connect("dbi:Sybase:server=ENGINEERING", $user, $passwd);</PRE>
  111. <P>
  112. <H2><A NAME="specifying other connection specific parameters">Specifying other connection specific parameters</A></H2>
  113. <P>It is sometimes necessary (or beneficial) to specify other connection
  114. properties. Currently the following are supported:</P>
  115. <DL>
  116. <DT><STRONG><A NAME="item_server">server</A></STRONG><BR>
  117. <DD>
  118. Specify the server that we should connect to
  119. <PRE>
  120.      $dbh = DBI->connect("dbi:Sybase:server=BILLING",
  121.                          $user, $passwd);</PRE>
  122. <P>The default server is <EM>SYBASE</EM>, or the value of the <EM>$DSQUERY</EM> environment
  123. variable, if it is set.</P>
  124. <P></P>
  125. <DT><STRONG><A NAME="item_database">database</A></STRONG><BR>
  126. <DD>
  127. Specify the database that should be made the default database.
  128. <PRE>
  129.      $dbh = DBI->connect("dbi:Sybase:database=sybsystemprocs",
  130.                          $user, $passwd);</PRE>
  131. <P>This is equivalent to</P>
  132. <PRE>
  133.     $dbh = DBI->connect('dbi:Sybase:', $user, $passwd);
  134.     $dbh->do("use sybsystemprocs");</PRE>
  135. <P></P>
  136. <DT><STRONG><A NAME="item_charset">charset</A></STRONG><BR>
  137. <DD>
  138. Specify the character set that the client uses.
  139. <PRE>
  140.      $dbh = DBI->connect("dbi:Sybase:charset=iso_1",
  141.                          $user, $passwd);</PRE>
  142. <P></P>
  143. <DT><STRONG><A NAME="item_language">language</A></STRONG><BR>
  144. <DD>
  145. Specify the language that the client uses.
  146. <PRE>
  147.      $dbh = DBI->connect("dbi:Sybase:language=us_english",
  148.                          $user, $passwd);</PRE>
  149. <P></P>
  150. <DT><STRONG><A NAME="item_packetSize">packetSize</A></STRONG><BR>
  151. <DD>
  152. Specify the network packet size that the connection should use. Using a
  153. larger packet size can increase performance for certain types of queries.
  154. See the Sybase documentation on how to enable this feature on the server.
  155. <PRE>
  156.      $dbh = DBI->connect("dbi:Sybase:packetSize=8192",
  157.                          $user, $passwd);</PRE>
  158. <P></P>
  159. <DT><STRONG><A NAME="item_interfaces">interfaces</A></STRONG><BR>
  160. <DD>
  161. Specify the location of an alternate <EM>interfaces</EM> file:
  162. <PRE>
  163.      $dbh = DBI->connect("dbi:Sybase:interfaces=/usr/local/sybase/interfaces",
  164.                          $user, $passwd);</PRE>
  165. <P></P>
  166. <DT><STRONG><A NAME="item_loginTimeout">loginTimeout</A></STRONG><BR>
  167. <DD>
  168. Specify the number of seconds that DBI-><A HREF="../../../lib/Pod/perlfunc.html#item_connect"><CODE>connect()</CODE></A> will wait for a 
  169. response from the Sybase server. If the server fails to respond before the
  170. specified number of seconds the DBI-><A HREF="../../../lib/Pod/perlfunc.html#item_connect"><CODE>connect()</CODE></A> call fails with a timeout
  171. error. The default value is 60 seconds, which is usually enough, but on a busy
  172. server it is sometimes necessary to increase this value:
  173. <PRE>
  174.      $dbh = DBI->connect("dbi:Sybase:loginTimeout=240", # wait up to 4 minutes
  175.                          $user, $passwd);</PRE>
  176. <P></P>
  177. <DT><STRONG><A NAME="item_timeout">timeout</A></STRONG><BR>
  178. <DD>
  179. Specify the number of seconds after which any Open Client calls will timeout
  180. the connection and mark it as dead. Once a timeout error has been received
  181. on a connection it should be closed and re-opened for further processing.
  182. <P>Setting this value to 0 or a negative number will result in an unlimited
  183. timeout value. See also the Open Client documentation on CS_TIMEOUT.</P>
  184. <PRE>
  185.      $dbh = DBI->connect("dbi:Sybase:timeout=240", # wait up to 4 minutes
  186.                          $user, $passwd);</PRE>
  187. <P></P>
  188. <DT><STRONG><A NAME="item_scriptName">scriptName</A></STRONG><BR>
  189. <DD>
  190. Specify the name for this connection that will be displayed in sp_who
  191. (ie in the sysprocesses table in the <EM>program_name</EM> column).
  192. <PRE>
  193.     $dbh->DBI->connect("dbi:Sybase:scriptName=myScript", $user, $password);</PRE>
  194. <P></P>
  195. <DT><STRONG><A NAME="item_hostname">hostname</A></STRONG><BR>
  196. <DD>
  197. Specify the hostname that will be displayed by sp_who (and will be stored
  198. in the hostname column of sysprocesses)..
  199. <PRE>
  200.     $dbh->DBI->connect("dbi:Sybase:hostname=kiruna", $user, $password);</PRE>
  201. <P></P>
  202. <DT><STRONG><A NAME="item_tdsLevel">tdsLevel</A></STRONG><BR>
  203. <DD>
  204. Specify the TDS protocol level to use when connecting to the server.
  205. Valid values are CS_TDS_40, CS_TDS_42, CS_TDS_46, CS_TDS_495 and CS_TDS_50.
  206. In general this is automatically negotiated between the client and the 
  207. server, but in certain cases this may need to be forced to a lower level
  208. by the client.
  209. <PRE>
  210.     $dbh->DBI->connect("dbi:Sybase:tdsLevel=CS_TDS_42", $user, $password);</PRE>
  211. <P><STRONG>NOTE</STRONG>: Setting the tdsLevel below CS_TDS_495 will disable a number of
  212. features, ?-style placeholders and CHAINED non-AutoCommit mode, in particular.</P>
  213. <P></P></DL>
  214. <P>These different parameters (as well as the server name) can be strung
  215. together by separating each entry with a semi-colon:</P>
  216. <PRE>
  217.     $dbh = DBI->connect("dbi:Sybase:server=ENGINEERING;packetSize=8192;language=us_english;charset=iso_1",
  218.                         $user, $pwd);</PRE>
  219. <P>
  220. <HR>
  221. <H1><A NAME="handling multiple result sets">Handling Multiple Result Sets</A></H1>
  222. <P>Sybase's Transact SQL has the ability to return multiple result sets
  223. from a single SQL statement. For example the query:</P>
  224. <PRE>
  225.     select b.title, b.author, s.amount
  226.       from books b, sales s
  227.      where s.authorID = b.authorID
  228.      order by b.author, b.title
  229.     compute sum(s.amount) by b.author</PRE>
  230. <P>which lists sales by author and title and also computes the total sales
  231. by author returns two types of rows. The DBI spec doesn't really 
  232. handle this situation, nor the more hairy</P>
  233. <PRE>
  234.     exec my_proc @p1='this', @p2='that', @p3 out</PRE>
  235. <P>where <CODE>my_proc</CODE> could return any number of result sets (ie it could
  236. perform an unknown number of <A HREF="../../../lib/Pod/perlfunc.html#item_select"><CODE>select</CODE></A> statements.</P>
  237. <P>I've decided to handle this by returning an empty row at the end
  238. of each result set, and by setting a special Sybase attribute in $sth
  239. which you can check to see if there is more data to be fetched. The 
  240. attribute is <STRONG>syb_more_results</STRONG> which you should check to see if you
  241. need to re-start the <CODE>fetch()</CODE> loop.</P>
  242. <P>To make sure all results are fetched, the basic <CODE>fetch</CODE> loop can be 
  243. written like this:</P>
  244. <PRE>
  245.      do {
  246.          while($d = $sth->fetch) {
  247.             ... do something with the data
  248.          }
  249.      } while($sth->{syb_more_results});</PRE>
  250. <P>You can get the type of the current result set with 
  251. $sth->{syb_result_type}. This returns a numerical value, as defined in 
  252. $SYBASE/include/cspublic.h:</P>
  253. <PRE>
  254.         #define CS_ROW_RESULT           (CS_INT)4040
  255.         #define CS_CURSOR_RESULT        (CS_INT)4041
  256.         #define CS_PARAM_RESULT         (CS_INT)4042
  257.         #define CS_STATUS_RESULT        (CS_INT)4043
  258.         #define CS_MSG_RESULT           (CS_INT)4044
  259.         #define CS_COMPUTE_RESULT       (CS_INT)4045</PRE>
  260. <P>In particular, the return status of a stored procedure is returned
  261. as CS_STATUS_RESULT (4043), and is normally the last result set that is 
  262. returned in a stored proc execution.</P>
  263. <P>If you add a</P>
  264. <PRE>
  265.     use DBD::Sybase;</PRE>
  266. <P>to your script then you can use the symbolic values (CS_xxx_RESULT) 
  267. instead of the numeric values in your programs, which should make them 
  268. easier to read.</P>
  269. <P>See also the <CODE>syb_output_param</CODE> <CODE>func()</CODE> call to handle stored procedures 
  270. that <STRONG>only</STRONG> return <STRONG>OUTPUT</STRONG> parameters.</P>
  271. <P>
  272. <HR>
  273. <H1><A NAME="$sth>execute() failure mode behavior">$sth-><CODE>execute()</CODE> failure mode behavior</A></H1>
  274. <P><STRONG>THIS HAS CHANGED IN VERSION 0.21!</STRONG></P>
  275. <P>DBD::Sybase has the ability to handle multi-statement SQL commands
  276. in a single batch. For example, you could insert several rows in 
  277. a single batch like this:</P>
  278. <PRE>
  279.    $sth = $dbh->prepare("
  280.    insert foo(one, two, three) values(1, 2, 3)
  281.    insert foo(one, two, three) values(4, 5, 6)
  282.    insert foo(one, two, three) values(10, 11, 12)
  283.    insert foo(one, two, three) values(11, 12, 13)
  284.    ");
  285.    $sth->execute;</PRE>
  286. <P>If anyone of the above inserts fails for any reason then $sth->execute
  287. will return <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>, <STRONG>HOWEVER</STRONG> the inserts that didn't fail will still
  288. be in the database, unless <CODE>AutoCommit</CODE> is off.</P>
  289. <P>It's also possible to write a statement like this:</P>
  290. <PRE>
  291.    $sth = $dbh->prepare("
  292.    insert foo(one, two, three) values(1, 2, 3)
  293.    select * from bar
  294.    insert foo(one, two, three) values(10, 11, 12)
  295.    ");
  296.    $sth->execute;</PRE>
  297. <P>If the second <CODE>insert</CODE> is the one that fails, then $sth->execute will
  298. <STRONG>NOT</STRONG> return <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>. The error will get flagged after the rows
  299. from <CODE>bar</CODE> have been fetched.</P>
  300. <P>I know that this is not as intuitive as it could be, but I am
  301. constrained by the Sybase API here.</P>
  302. <P>As an aside, I know that the example above doesn't really make sense, 
  303. but I need to illustrate this particular sequence... You can also see the 
  304. t/fail.t test script which shows this particular behavior.</P>
  305. <P>
  306. <HR>
  307. <H1><A NAME="sybase specific attributes">Sybase Specific Attributes</A></H1>
  308. <P>There are a number of handle  attributes that are specific to this driver.
  309. These attributes all start with <STRONG>syb_</STRONG> so as to not clash with any
  310. normal DBI attributes.</P>
  311. <P>
  312. <H2><A NAME="database handle attributes">Database Handle Attributes</A></H2>
  313. <P>The following Sybase specific attributes can be set at the Database handle
  314. level:</P>
  315. <DL>
  316. <DT><STRONG><A NAME="item_syb_show_sql">syb_show_sql (bool)</A></STRONG><BR>
  317. <DD>
  318. If set then the current statement is included in the string returned by 
  319. $dbh->errstr.
  320. <P></P>
  321. <DT><STRONG><A NAME="item_syb_show_eed">syb_show_eed (bool)</A></STRONG><BR>
  322. <DD>
  323. If set, then extended error information is included in the string returned 
  324. by $dbh->errstr. Extended error information include the index causing a
  325. duplicate insert to fail, for example.
  326. <P></P>
  327. <DT><STRONG><A NAME="item_syb_err_handler">syb_err_handler (subroutine ref)</A></STRONG><BR>
  328. <DD>
  329. <STRONG>Note:</STRONG> The syntax for the error handler is experimental and
  330. may change in future versions.
  331. <P>This attribute is used to set an ad-hoc error handler callback (ie a perl 
  332. subroutine) that gets called before the normal error handler does it's job.
  333. If this subroutine returns 0 then the error is ignored. This is useful
  334. for handling PRINT statements in Transact-SQL, for handling messages
  335. from the Backup Server, showplan output, dbcc output, etc.</P>
  336. <P>The subroutine is called with 7 parameters: the Sybase error number,
  337. the severity, the state, the line number in the SQL batch, the server name 
  338. (if available), the stored procedure name (if available), and the message
  339. text.</P>
  340. <P>For client-side errors the state and line number are always 0, and the 
  341. server name and procedure name are always undef.</P>
  342. <P>Example:</P>
  343. <PRE>
  344.     %showplan_msgs = map { $_ => 1}  (3612 .. 3615, 6201 .. 6225);
  345.     sub err_handler {
  346.         my($err, $sev, $state, $line, $server, $proc, $msg) = @_;</PRE>
  347. <PRE>
  348.         if($showplan_msgs{$err}) { # it's a showplan message
  349.             print SHOWPLAN "$err - $msg\n";
  350.             return 0;    # This is not an error
  351.         }</PRE>
  352. <PRE>
  353.         return 1;
  354.     }</PRE>
  355. <PRE>
  356.     $dbh = DBI->connect('dbi:Sybase:server=troll', 'sa', '');
  357.     $dbh->{syb_err_handler} = \&err_handler;
  358.     $dbh->do("set showplan on");
  359.     open(SHOWPLAN, ">>/var/tmp/showplan.log") || die "Can't open showplan log: $!";
  360.     $dbh->do("exec someproc");    # get the showplan trace for this proc.
  361.     $dbh->disconnect;</PRE>
  362. <P></P>
  363. <DT><STRONG><A NAME="item_syb_flush_finish">syb_flush_finish (bool)</A></STRONG><BR>
  364. <DD>
  365. If $dbh->{syb_flush_finish} is set then $dbh->finish will drain
  366. any results remaining for the current command by actually fetching them.
  367. The default behaviour is to issue a ct_cancel(CS_CANCEL_ALL), but this
  368. <EM>appears</EM> to cause connections to hang or to fail in certain cases (although
  369. I've never witnessed this myself.)
  370. <P></P>
  371. <DT><STRONG><A NAME="item_syb_dynamic_supported">syb_dynamic_supported (bool)</A></STRONG><BR>
  372. <DD>
  373. This is a read-only attribute that returns TRUE if the dataserver
  374. you are connected to supports ?-style placeholders. Typically placeholders are
  375. not supported when using DBD::Sybase to connect to a MS-SQL server.
  376. <P></P>
  377. <DT><STRONG><A NAME="item_syb_chained_txn">syb_chained_txn (bool)</A></STRONG><BR>
  378. <DD>
  379. If set then we use CHAINED transactions when AutoCommit is off. 
  380. Otherwise we issue an explicit BEGIN TRAN as needed. The default is off.
  381. <P>This attribute should usually be used only during the <A HREF="../../../lib/Pod/perlfunc.html#item_connect"><CODE>connect()</CODE></A> call:</P>
  382. <PRE>
  383.     $dbh = DBI->connect('dbi:Sybase:', $user, $pwd, {syb_chained_txn => 1});</PRE>
  384. <P>Using it at any other time with <STRONG>AutoCommit</STRONG> turned <STRONG>off</STRONG> will 
  385. <STRONG>force a commit</STRONG> on the current handle.</P>
  386. <P></P>
  387. <DT><STRONG><A NAME="item_syb_quoted_identifier">syb_quoted_identifier (bool)</A></STRONG><BR>
  388. <DD>
  389. If set, then identifiers that would normally clash with Sybase reserved
  390. words can be quoted using <CODE>"identifier"</CODE>. In this case strings must
  391. be quoted with the single quote.
  392. <P>Default is for this attribute to be <STRONG>off</STRONG>.</P>
  393. <P></P>
  394. <DT><STRONG><A NAME="item_syb_rowcount">syb_rowcount (int)</A></STRONG><BR>
  395. <DD>
  396. Setting this attribute to non-0 will limit the number of rows returned by
  397. a <EM>SELECT</EM>, or affected by an <EM>UPDATE</EM> or <EM>DELETE</EM> statement to the
  398. <EM>rowcount</EM> value. Setting it back to 0 clears the limit.
  399. <P>Default is for this attribute to be <STRONG>0</STRONG>.</P>
  400. <P></P>
  401. <DT><STRONG><A NAME="item_syb_do_proc_status">syb_do_proc_status (bool)</A></STRONG><BR>
  402. <DD>
  403. Setting this attribute causes $sth-><CODE>execute()</CODE> to fetch the return status
  404. of any executed stored procs in the SQL being executed. If the return
  405. status is non-0 then $sth-><CODE>execute()</CODE> will report that the operation 
  406. failed (ie it will return <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>)
  407. <P>Setting this attribute does <STRONG>NOT</STRONG> affect existing $sth handles, only
  408. those that are created after setting it. To change the behavior of 
  409. an existing $sth handle use $sth->{syb_do_proc_status}.</P>
  410. <P>The default is for this attribute to be <STRONG>off</STRONG>.</P>
  411. <P></P>
  412. <DT><STRONG><A NAME="item_syb_oc_version">syb_oc_version (string)</A></STRONG><BR>
  413. <DD>
  414. Returns the identification string of the version of Client Library that
  415. this binary is currently using. This is a read-only attribute.
  416. <P>For example:</P>
  417. <PRE>
  418.     troll (7:59AM):348 > perl -MDBI -e '$dbh = DBI->connect("dbi:Sybase:", "sa"); print "$dbh->{syb_oc_version}\n";' 
  419.     Sybase Client-Library/11.1.1/P/Linux Intel/Linux 2.2.5 i586/1/OPT/Mon Jun  7 07:50:21 1999</PRE>
  420. <P>This is very useful information to have when reporting a problem.</P>
  421. <P></P></DL>
  422. <P>
  423. <H2><A NAME="statement handle attributes">Statement Handle Attributes</A></H2>
  424. <P>The following read-only attributes are available at the statement level:</P>
  425. <DL>
  426. <DT><STRONG><A NAME="item_syb_more_results">syb_more_results (bool)</A></STRONG><BR>
  427. <DD>
  428. See the discussion on handling multiple result sets above.
  429. <P></P>
  430. <DT><STRONG><A NAME="item_syb_result_type">syb_result_type (int)</A></STRONG><BR>
  431. <DD>
  432. Returns the numeric result type of the current result set. Useful when 
  433. executing stored procedurs to determine what type of information is
  434. currently fetchable (normal select rows, output parameters, status results,
  435. etc...).
  436. <P></P>
  437. <DT><STRONG>syb_do_proc_status (bool)</STRONG><BR>
  438. <DD>
  439. See above (under Database Handle Attributes) for an explanation.
  440. <P></P></DL>
  441. <P>
  442. <HR>
  443. <H1><A NAME="controlling datetime output formats">Controlling DATETIME output formats</A></H1>
  444. <P>By default DBD::Sybase will return <EM>DATETIME</EM> and <EM>SMALLDATETIME</EM>
  445. columns in the <EM>Nov 15 1998 11:13AM</EM> format. This can be changed
  446. via a special <STRONG>_date_fmt()</STRONG> function that is accessed via the $dbh-><CODE>func()</CODE>
  447. method.</P>
  448. <P>The syntax is</P>
  449. <PRE>
  450.     $dbh->func($fmt, '_date_fmt');</PRE>
  451. <P>where $fmt is a string representing the format that you want to apply.</P>
  452. <P>The formats are based on Sybase's standard conversion routines. The following
  453. subset of available formats has been implemented:</P>
  454. <DL>
  455. <DT><STRONG><A NAME="item_LONG">LONG</A></STRONG><BR>
  456. <DD>
  457. Nov 15 1998 11:30:11:496AM
  458. <P></P>
  459. <DT><STRONG><A NAME="item_SHORT">SHORT</A></STRONG><BR>
  460. <DD>
  461. Nov 15 1998 11:30AM
  462. <P></P>
  463. <DT><STRONG><A NAME="item_DMY4_YYYY">DMY4_YYYY</A></STRONG><BR>
  464. <DD>
  465. 15 Nov 1998
  466. <P></P>
  467. <DT><STRONG><A NAME="item_MDY1_YYYY">MDY1_YYYY</A></STRONG><BR>
  468. <DD>
  469. 11/15/1998
  470. <P></P>
  471. <DT><STRONG><A NAME="item_DMY1_YYYY">DMY1_YYYY</A></STRONG><BR>
  472. <DD>
  473. 15/11/1998
  474. <P></P>
  475. <DT><STRONG><A NAME="item_HMS">HMS</A></STRONG><BR>
  476. <DD>
  477. 11:30:11
  478. <P></P></DL>
  479. <P>
  480. <HR>
  481. <H1><A NAME="retrieving output parameters from stored procedures">Retrieving OUTPUT parameters from stored procedures</A></H1>
  482. <P>Sybase lets you pass define <STRONG>OUTPUT</STRONG> parameters to stored procedures,
  483. which are a little like parameters passed by reference in C (or perl.)</P>
  484. <P>In Transact-SQL this is done like this</P>
  485. <PRE>
  486.    declare @id_value int, @id_name char(10)
  487.    exec my_proc @name = 'a string', @number = 1234, @id = @id_value OUTPUT, @out_name = @id_name OUTPUT
  488.    -- Now @id_value and @id_name are set to whatever 'my_proc' set @id and @out_name to</PRE>
  489. <P>So how can we get at @param using DBD::Sybase?</P>
  490. <P>If your stored procedure <STRONG>only</STRONG> returns <STRONG>OUTPUT</STRONG> parameters, then you
  491. can use this shorthand:</P>
  492. <PRE>
  493.     $sth = $dbh->prepare('...');
  494.     $sth->execute;
  495.     @results = $sth->func('syb_output_params');</PRE>
  496. <P>This will return an array for all the OUTPUT parameters in the proc call,
  497. and will ignore any other results. The array will be undefined if there are 
  498. no OUTPUT params, or if the stored procedure failed for some reason.</P>
  499. <P>The more generic way looks like this:</P>
  500. <PRE>
  501.    $sth = $dbh->prepare("declare \@id_value int, \@id_name
  502.       exec my_proc @name = 'a string', @number = 1234, @id = @id_value OUTPUT, @out_name = @id_name OUTPUT");
  503.    $sth->execute;
  504.    do {
  505.       while($d = $sth->fetch) {
  506.          if($sth->{syb_result_type} == 4042) { # it's a PARAM result
  507.             $id_value = $d->[0];
  508.             $id_name  = $d->[1];
  509.          }
  510.       }
  511.    } while($sth->{syb_more_results});</PRE>
  512. <P>So the OUTPUT params are returned as one row in a special result set.</P>
  513. <P>
  514. <HR>
  515. <H1><A NAME="multiple active statements on one $dbh">Multiple active statements on one $dbh</A></H1>
  516. <P>It is possible to open multiple active statements on a single database 
  517. handle. This is done by openeing a new physical connection in $dbh-><CODE>prepare()</CODE>
  518. if there is already an active statement handle for this $dbh.</P>
  519. <P>This feature has been implemented to improve compatibility with other
  520. drivers, but should not be used if you are coding directly to the 
  521. Sybase driver.</P>
  522. <P>If AutoCommit is <STRONG>OFF</STRONG> then multiple statement handles on a single $dbh
  523. is <STRONG>NOT</STRONG> supported. This is to avoid various deadlock problems that
  524. can crop up in this situation, and because you will not get real transactional
  525. integrity using multiple statement handles simultaneously as these in 
  526. reality refer to different physical connections.</P>
  527. <P>
  528. <HR>
  529. <H1><A NAME="image and text datatypes">IMAGE and TEXT datatypes</A></H1>
  530. <P>DBD::Sybase uses the standard OpenClient conversion routines to convert
  531. data retrieved from the server into either string or numeric format.</P>
  532. <P>The conversion routines convert IMAGE datatypes to a hexadecimal string.
  533. If you need the binary representation you can use something like</P>
  534. <PRE>
  535.     $binary = pack("H*", $hex_string);</PRE>
  536. <P>to do the conversion. Note that TEXT columns are not treated this way
  537. and will be returned exactly as they were stored. Internally Sybase
  538. makes no distinction between TEXT and IMAGE columns - both can be
  539. used to store either text or binary data.</P>
  540. <P>Note that IMAGE or TEXT datatypes can not be passed as parameters
  541. when using ?-style placeholders, and ?-style placeholders can't refer
  542. to TEXT or IMAGE columns.</P>
  543. <P>
  544. <HR>
  545. <H1><A NAME="autocommit, transactions and transactsql">AutoCommit, Transactions and Transact-SQL</A></H1>
  546. <P>When $h->{AutoCommit} is <EM>off</EM> all data modification SQL statements
  547. that you issue (insert/update/delete) will only take effect if you
  548. call $dbh->commit.</P>
  549. <P>DBD::Sybase implements this via two distinct methods, depending on 
  550. the setting of the $h->{syb_chained_txn} attribute and the version of the
  551. server that is being accessed.</P>
  552. <P>If $h->{syb_chained_txn} is <EM>off</EM>, then the DBD::Sybase driver
  553. will send a <STRONG>BEGIN TRAN</STRONG> before the first $dbh->prepare(), and
  554. after each call to $dbh-><CODE>commit()</CODE> or $dbh->rollback(). This works
  555. fine, but will cause any SQL that contains any <EM>CREATE TABLE</EM>
  556. (or other DDL) statements to fail. These <EM>CREATE TABLE</EM> statements can be
  557. burried in a stored procedure somewhere (for example,
  558. <CODE>sp_helprotect</CODE> creates two temp tables when it is run). 
  559. You <EM>can</EM> get around this limit by setting the <CODE>ddl in tran</CODE> option
  560. (at the database level, via <CODE>sp_dboption</CODE>.) You should be aware that
  561. this can have serious effects on performance as this causes locks to
  562. be held on certain system tables for the duration of the transaction.</P>
  563. <P>If $h->{syb_chained_txn} is <EM>on</EM>, then DBD::Sybase sets the
  564. <EM>CHAINED</EM> option, which tells Sybase not to commit anything automatically.
  565. Again, you will need to call $dbh-><CODE>commit()</CODE> to make any changes to the data
  566. permanent. In this case Sybase will not let you issue <EM>BEGIN TRAN</EM> 
  567. statements in the SQL code that is executed, so if you need to execute
  568. stored procedures that have <EM>BEGIN TRAN</EM> statements in them you 
  569. must use $h->{syb_chained_txn} = 0, or $h->{AutoCommit} = 1.</P>
  570. <P>
  571. <HR>
  572. <H1><A NAME="using  placeholders & bind parameters to $sth>execute">Using ? Placeholders & bind parameters to $sth->execute</A></H1>
  573. <P>This version supports the use of ? placeholders in SQL statements. It does 
  574. this by using what Sybase calls <EM>Dynamic SQL</EM>. The ? placeholders allow
  575. you to write something like:</P>
  576. <PRE>
  577.         $sth = $dbh->prepare("select * from employee where empno = ?");</PRE>
  578. <PRE>
  579.         # Retrieve rows from employee where empno == 1024:
  580.         $sth->execute(1024);
  581.         while($data = $sth->fetch) {
  582.             print "@$data\n";
  583.         }</PRE>
  584. <PRE>
  585.        # Now get rows where empno = 2000:
  586. </PRE>
  587. <PRE>
  588.  
  589.         $sth->execute(2000);
  590.         while($data = $sth->fetch) {
  591.             print "@$data\n";
  592.         }</PRE>
  593. <P>When you use ? placeholders Sybase goes and creates a temporary stored 
  594. procedure that corresponds to your SQL statement. You then pass variables
  595. to $sth->execute or $dbh->do, which get inserted in the query, and any rows
  596. are returned.</P>
  597. <P>For those of you who are used to Transact-SQL there are some limitations
  598. to using this feature: In particular you can <STRONG>not</STRONG> pass parameters this
  599. way to stored procedures, and you can only execute a SQL statement
  600. that returns a single result set. In addition, the ? placeholders can only appear in a 
  601. <STRONG>WHERE</STRONG> clause, in the <STRONG>SET</STRONG> clause of an <STRONG>UPDATE</STRONG> statement, or in the
  602. <STRONG>VALUES</STRONG> list of an <STRONG>INSERT</STRONG> statement. In particular you can't pass ?
  603. as a parameter to a stored procedure.</P>
  604. <P>?-style placeholders can <STRONG>NOT</STRONG> be used to pass TEXT or IMAGE data
  605. items to the server. This is a limitation of the TDS protocol, not of
  606. DBD::Sybase.</P>
  607. <P>There is also a performance issue: OpenClient creates stored procedures in
  608. tempdb for each <CODE>prepare()</CODE> call that includes ? placeholders. Creating
  609. these objects requires updating system tables in the tempdb database, and
  610. can therefore create a performance hotspot if a lot of <CODE>prepare()</CODE> statements
  611. from multiple clients are executed simultaneously (I have heard that
  612. Sybase 11.9.x corrects this hotspot problem.) In general it is better
  613. if your application is going to run against Sybase to write ad-hoc
  614. stored procedures rather than use the ? placeholders in embedded SQL.</P>
  615. <P>It is not possible to retrieve the last <EM>IDENTITY</EM> value
  616. after an insert done with ?-style placeholders. This is a Sybase
  617. limitation/bug, not a DBD::Sybase problem. For example, assuming table
  618. <EM>foo</EM> has an identity column:</P>
  619. <PRE>
  620.   $dbh->do("insert foo(col1, col2) values(?, ?)", undef, "string1", "string2");
  621.   $sth = $dbh->prepare('select @@identity') 
  622.     || die "Can't prepare the SQL statement: $DBI::errstr";
  623.   $sth->execute || die "Can't execute the SQL statement: $DBI::errstr";</PRE>
  624. <PRE>
  625.   #Get the data back.
  626.   while (my $row = $sth->fetchrow_arrayref()) {
  627.     print "IDENTITY value = $row->[0]\n";
  628.   }</PRE>
  629. <P>will always return an identity value of 0, which is obviously incorrect.
  630. This behaviour is due to the fact that the handling of ?-style placeholders
  631. is implemented using temporary stored procedures in Sybase, and the value
  632. of <CODE>@@identity</CODE> is reset when the stored procedure has executed. Using an 
  633. explicit stored procedure to do the insert and trying to retrieve
  634. <CODE>@@identity</CODE> after it has executed results in the same behaviour.</P>
  635. <P>Please see the discussion on Dynamic SQL in the 
  636. OpenClient C Programmer's Guide for details. The guide is available on-line
  637. at <A HREF="http://sybooks.sybase.com/">http://sybooks.sybase.com/</A></P>
  638. <P>
  639. <HR>
  640. <H1><A NAME="bugs">BUGS</A></H1>
  641. <P>You can run out of space in the tempdb database if you use a lot of
  642. calls with bind variables (ie ?-style placeholders) without closing the
  643. connection. On my system, with an 8 MB tempdb database I run out of space
  644. after 760 <CODE>prepare()</CODE> statements with ?-parameters. This is because
  645. Sybase creates stored procedures for each <CODE>prepare()</CODE> call. So my
  646. suggestion is to only use ?-style placeholders if you really need them
  647. (i.e. if you are going to execute the same prepared statement multiple
  648. times).</P>
  649. <P>I have a simple bug tracking database at <A HREF="http://gw.peppler.org/cgi-bin/bug.cgi.">http://gw.peppler.org/cgi-bin/bug.cgi.</A>
  650. You can use it to view known problems, or to report new ones. Keep in
  651. mind that peppler.org is connected to the net via a K56 dialup line, so
  652. it may be slow.</P>
  653. <P>
  654. <HR>
  655. <H1><A NAME="see also">SEE ALSO</A></H1>
  656. <P><A HREF="../../../site/lib/DBI.html">the DBI manpage</A></P>
  657. <P>Sybase OpenClient C manuals.</P>
  658. <P>Sybase Transact SQL manuals.</P>
  659. <P>
  660. <HR>
  661. <H1><A NAME="author">AUTHOR</A></H1>
  662. <P>DBD::Sybase by Michael Peppler</P>
  663. <P>
  664. <HR>
  665. <H1><A NAME="copyright">COPYRIGHT</A></H1>
  666. <P>The DBD::Sybase module is Copyright (c) 1997-1999 Michael Peppler.
  667. The DBD::Sybase module is free software; you can redistribute it and/or
  668. modify it under the same terms as Perl itself with the exception that it
  669. cannot be placed on a CD-ROM or similar media for commercial distribution
  670. without the prior approval of the author.</P>
  671. <P>
  672. <HR>
  673. <H1><A NAME="acknowledgements">ACKNOWLEDGEMENTS</A></H1>
  674. <P>Tim Bunce for DBI, obviously!</P>
  675. <P>See also <A HREF="../../../site/lib/DBI/acknowledgements.html">ACKNOWLEDGEMENTS in the DBI manpage</A>.</P>
  676. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  677. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  678. <STRONG><P CLASS=block> DBD::Sybase - Sybase database driver for the DBI module</P></STRONG>
  679. </TD></TR>
  680. </TABLE>
  681.  
  682. </BODY>
  683.  
  684. </HTML>
  685.