簡體   English   中英

在SQL傳遞查詢中使用Access函數

[英]Use Access function in SQL pass-through query

我有一個帶有Oracle SQL后端數據庫的MS Access前端。

我正在嘗試創建一個傳遞查詢,該傳遞查詢包含Access中的一個函數。 該功能用於根據用戶在登錄屏幕上jobnumber的內容來設置jobnumber

SELECT 
    CC_QAQC_SPEC_MASTER.JOBNUMBER, 
    CC_QAQC_SPEC_MASTER.SPECSECTION,
    CC_QAQC_SPEC_MASTER.SPECDESCRIPTION,
    CC_QAQC_SPEC_MASTER.ID
FROM 
    CC_QAQC_SPEC_MASTER
WHERE 
    CC_QAQC_SPEC_MASTER.JOBNUMBER=GET_QAQC_JOB()
ORDER BY 
    CC_QAQC_SPEC_MASTER.SPECSECTION, 
    CC_QAQC_SPEC_MASTER.SPECDESCRIPTION;

當我運行以上命令時,我收到一條錯誤消息,內容為:

ODBC-調用失敗[Oracle] [ODBC] [Ora] ORA-00942:表或視圖不存在(#942)

好吧,由於sql是“原始”發送給Oracle的,因此服務器端數據庫當然不知道如何使用VBA函數。

因此,一種可能的解決方案是將VBA函數重新創建為定標器oracle函數。

但是,由於該給定函數沒有參數,因此我們可以假定該函數返回給定值-darn接近於靜態值,或者是您希望/希望傳遞給oracle的值。

然后,該方法意味着我們必須在嘗試使用或執行該PT查詢之前先解析客戶端的功能。

因此,我建議您采用上述PT查詢並將其復制。 (訪問側)。 現在,您有兩個PT查詢。

現在,在代碼中,我們獲取SQL,對其進行修改,將其推入第二個查詢中,現在您可以自由啟動+使用該直通查詢(用於報表,記錄集,表單等)

因此,您的代碼將如下所示:

Sub MyOraclePT()

  Dim strSQL     As String

  strSQL = CurrentDb.QueryDefs("PT1").SQL    ' <-- this change

  strSQL = Replace(strSQL, "GET_QAQC_JOB()", GET_QAQC_JOB())

  CurrentDb.QueryDefs("PT2").SQL = strSQL

  ' now you can open or use this query.

  '
  Dim rst     As DAO.Recordset
  Set rst = CurrentDb.OpenRecordset("PT2")

  ' or open a report/form based on that PT2 query
  ' such as
  DoCmd.OpenReport "MyReport", acViewPreview


End Sub

因此,我們使用了兩個PT查詢,因為第一個是上面的sql。 然后,我們修改第二個PT查詢,以將函數值替換為函數的實際值。

上面假設函數是數字(不是字符串)。 如果CC_QAQC_SPEC_MASTER.JOBNUMBER列是一個字符串,則可以在第一個PT查詢中將/將單引號放在函數名稱周圍。

我還注意到一個錯誤/語法錯誤,因為您有:

WHERE 
    CC_QAQC_SPEC_MASTER.JOBNUMBER)=GET_QAQC_JOB()

在上方,我在上方看到一個流浪“)”-您想解決該問題。

假設該函數是用Access中的VBA編寫的函數,則不能從查詢中調用它。 我相信查詢中的DML會全部發送到源系統,在這種情況下是Oracle。 Oracle不知道該功能是什么以及錯誤。

選項1 :在VBA中通過ADO.NET提交查詢

放棄Access中的直通查詢對象。 從通過ADO或類似工具連接到Oracle的VBA執行查詢。 關於如何使用ADO從外部數據源中提取數據的資源很多,例如如何打開ADO連接和記錄集對象 是使用DAO的示例。

選項2 :將通過查詢包裝到另一個查詢中

使用Access,您可以創建調用其他查詢的查詢。 創建不帶WHERE謂詞的直通查詢。 這是直通查詢。 創建另一個訪問查詢,該查詢調用直通查詢。 這是包裝查詢。 包裝查詢(由於其本地Access SQL)應具有用於過濾結果集的參數。

完整披露。 我沒有嘗試使用Oracle。

現在,如果直通查詢正在獲取大量數據。 此選項效果不佳。

選項3 :動態創建直通查詢

您有一個事件(單擊按鈕或進行任何其他操作)調用VBA子過程,該子過程動態創建並為查詢分配SQL:

Public Sub foo()
    Let qaqc_job_number = GET_QAQC_JOB()
    Set Query = CurrentDb.QueryDefs("<your-pass-thru-function-name>")

    Let sql_job_data = "SELECT" & _
                       "CC_QAQC_SPEC_MASTER.JOBNUMBER, " & _
                       "CC_QAQC_SPEC_MASTER.SPECSECTION, " & _
                       "CC_QAQC_SPEC_MASTER.SPECDESCRIPTION, " & _
                       "CC_QAQC_SPEC_MASTER.ID " & _
                       "FROM " & _
                       "CC_QAQC_SPEC_MASTER " & _
                       "WHERE " & _
                       "CC_QAQC_SPEC_MASTER.JOBNUMBER)= " & qaqc_job_number & " " & _
                       "Order BY " & _
                       "CC_QAQC_SPEC_MASTER.SPECSECTION, " & _
                       "CC_QAQC_SPEC_MASTER.SPECDESCRIPTION; "

    Let Query.Sql = sql_job_data

End Sub

然后,您運行查詢。

您在此Access查詢對象中保留的SQL中的所有內容都必須存在於Oracle中,並且只能存在於Oracle中。

暫無
暫無

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

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