簡體   English   中英

如何在perl中的表行中轉義特殊字符

[英]How to escape special character in the table line in perl

我試圖訪問一個名稱中有特殊字符的表,有人可以請幫助:(

SELECT 
  q.user_data.chat_event_text, q.enq_time
FROM 
  swapp_owner.aq'$'CHAT_EVENT_QUEUE_table q,
  CHAT_EVENT_QUEUE_table p
where 
      q.expiration_reason = 'TIME_EXPIRATION'
  and q.msg_id=p.msg_Id
  and p.enq_time > (SYSDATE - 50000/(24*60))
order by 
  q.enq_time desc;

錯誤:

名稱“main :: CHAT_EVENT_QUEUE_table”僅使用一次:./t21行可能的拼寫錯誤30.在連接(。)中使用未初始化的值$ CHAT_EVENT_QUEUE_table或在./t21第30行使用字符串.DBD :: Oracle :: db prepare failed: ORA-01756:引用字符串未正確終止(DBD錯誤:OCIStmtPrepare)[for Statement“SELECT q.user_data.chat_event_text,q.enq_time FROM swapp_owner.aq'q,CHAT_EVENT_QUEUE_table p其中q.expiration_reason ='TIME_EXPIRATION'和q.msg_id = p.msg_Id和p.enq_time>(SYSDATE - 50000 /(24 * 60))按q.enq_time desc排序;“]在./t21第30行.DBD :: Oracle :: db准備失敗:ORA-01756:引用字符串未正確終止(DBD ERROR:OCIStmtPrepare)[for Statement“SELECT q.user_data.chat_event_text,q.enq_time FROM swapp_owner.aq'q,CHAT_EVENT_QUEUE_table p其中q.expiration_reason ='TIME_EXPIRATION'和q.msg_id = p.msg_Id和p.enq_time>(SYSDATE - 50000 /(24 * 60))按q.enq_time desc排序;“]在./t21第30行。

添加完整腳本:

!/usr/bin/perl -w


BEGIN {   $ENV{ORACLE_HOME}='/u01/app/oracle/product/11.1.0/'; } use strict;

use DBI; use utf8;

my $DB='pre14msv'; my $db_user='SWAPP_OWNER'; my $password=`/usr/bin/pmo view password -u $db_user -t $DB`; chomp($password); my $db = DBI->connect( "dbi:Oracle:pre14msv", $db_user, $password )

    || die( $DBI::errstr . "\n" );

$db->{AutoCommit}    = 0;

$db->{RaiseError}    = 1;

$db->{ora_check_sql} = 0;

$db->{RowCacheSize}  = 16;


my $sth = $db->prepare("SELECT q.user_data.chat_event_text, p.enq_time FROM swapp_owner.aq\$\CHAT_EVENT_QUEUE_table q,CHAT_EVENT_QUEUE_table p where q.expiration_reason = 'TIME_EXPIRATION' and q.msg_id=p.msg_Id and p.enq_time > (SYSDATE - 50000/(24*60)) order by q.enq_time desc; "); $sth->execute();

while ( my @row = $sth->fetchrow_array() ) {
    foreach (@row) {
        $_ = "\t" if !defined($_);
        print "$_\t";
    }
    print "\n"; }


print "If you see this, execute phase succeeded without a problem.\n";

END {

    $db->disconnect if defined($db); }

在Perl中, '內部變量名與::相同,所以$'CHAT_EVENT_QUEUE_table變為$::CHAT_EVENT_QUEUE_table ,這是包main的包變量: $main::CHAT_EVENT_QUEUE_table - 除了你沒有這樣的變量。

如果您希望文字字符串$'CHAT_EVENT_QUEUE_table存在,請將SQL放入單引號字符串中,該字符串不插入變量,例如

my $sth = $db->prepare(q(... SQL here no $'variables ...));

如果由於某種原因你需要轉義碼,請轉義$\\$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM