2013-04-11 95 views
2

我使用DBAL作爲獨立的沒有ORM,因爲我不需要它。不過,我現在在查詢中使用oracle關鍵字時會出現一些問題 比如我有以下代碼:Doctrine DBAL和Oracle關鍵字

$journal = array(
    'LGM_ID'  => 'SEQ_JOURNAL.NEXTVAL', 
    'LGM_USER_LOGIN' => "a user", 
    'LGM_DATE'  => 'CURRENT_TIMESTAMP' 
); 
$db->insert('JOURNAL', $journal); 

而且這也不行,我得到以下錯誤:

ORA-01722: invalid number 

我想這是因爲序列的使用。一個整數替換數組中的第一個項目之後,我有以下錯誤:

ORA-01858: a non-numeric character was found where a numeric was expected 

這一次,我想這是因爲CURRENT_TIMESTAMP關鍵字。

我想在當時通過查詢關鍵字轉換爲字符串時,它不起作用。有什麼方法可以使用序列或其他關鍵字,而不使用ORM等額外的東西?

對於序列我想我可以運行另一個請求之前獲得nextval。 但是,對於CURRENT_TIMESTAMP,我實際上並不想使用php日期時間,因爲我的日期是時區分割的,它會爲oracle完美處理的函數添加額外的代碼。

我最後的解決方案是將完整查詢寫爲字符串並使用$ db-> query(...),但它不是抽象層的目標。

非常感謝您的幫助。

+0

你可以記錄'$ db-> insert('JOURNAL',$ journal);'發送給Oracle的SQL語句嗎? – 2013-04-11 15:22:49

+0

嗨,我很新的DBAL,所以我不知道如何輕鬆做到這一點。我會檢查文件並儘快回覆給你。 – user1923976 2013-04-12 07:24:31

回答

0

我在回答最後的評論,因爲我無法格式化新評論,因爲我想要。

所有我可以登錄與DBAL是這樣的:請求和參數:

INSERT INTO JOURNAL (LGM_TYPE, LGM_SUBTYPE, LGM_OBJECT_ID, LGM_OBJECT_TABLE, LGM_DATA, LGM_ID, LGM_USER_LOGIN, LGM_DATE) VALUES (?, ?, ?, ?, ?, ?, ?, ?) 

Array 
( 
    [0] => 3 
    [1] => 0 
    [2] => 245 
    [3] => ENTITY 
    [4] => Deletion of specific entity 
    [5] => 1 
    [6] => user 
    [7] => CURRENT_TIMESTAMP 
) 

我不知道我們能得到確切的查詢語句的字符串。

1

我不確定CURRENT_TIMESTAMP的行爲如何,但我確定的是該序列的字符串會產生錯誤。

原則(或PDO爲它的價值)將簡單地將字符串SEQ_JOURNAL.NEXTVAL綁定到LGM_ID列。

據我所知,你有兩種方法來處理這個問題。

第一種方法

遞增序列的第一個值,並得到它:

$id = (int) $db->fetchColumn('SELECT SEQ_JOURNAL.NEXTVAL FROM dual'); 

使用檢索到的ID在你插入語句:

$journal = array(
    'LGM_ID' => $id, 
    'LGM_USER_LOGIN' => "a user", 
    'LGM_DATE' => 'CURRENT_TIMESTAMP' 
); 

$db->insert('JOURNAL', $journal); 

這種方法的缺點方法是它涉及兩個查詢。

方法二

這一個是基於一份聲明,而不是DBAL的快捷方式(插入()是一個DBAL的快捷方式真正準備好的語句,executeUpdate的()):

$db->executeUpdate(" 
    INSERT INTO JOURNAL (
     LGM_ID, 
     LGM_USER_LOGIN, 
     LGM_DATE 
    ) VALUES (
     SEQ_JOURNAL.NEXTVAL, 
     :userLogin, 
     CURRENT_TIMESTAMP 
    ) 
", array(
    :userLogin => 'a user', 
)); 

在我看來它比第一個更好,你可以使用CURRENT_TIMESTAMP函數(我不確定第一個用例)。

如果要以不同的方式處理CURRENT_TIMESTAMP,可以將列的默認值設置爲當前日期。