2017-03-08 57 views
0

後我目前面臨着兩難的選擇:ORDS響應插入

  • 一方面,如果我用AutoREST,我可以輕鬆地獲得POST響應。但是,我無法像我想要的那樣自定義API行爲,例如顯示案例的查詢。

    • 我啓用了AutoREST with Table對象。我知道我可以使用?q={}來執行查詢。
    • 但是我無法查詢大小寫不敏感的數據。
    • 例如,?q={"name":"Chang"}但我想查找姓名chang的所有日期,而不考慮字母大小寫。
    • 我知道我可以定義一個自定義的處理程序來做到這一點,並做爲?name=chang查詢。但是,如果目前我做了ords.enable_object,那麼無論如何要自定義它呢?
  • 另一方面,如果我定義了每個需要的服務,我無法獲得正確的POST響應。

    • 我想實現POST服務並在插入後返回某些值(即輸出一些值到POST的響應)。我嘗試了幾種方法,但沒有運氣。
    • 我已經嘗試聲明局部變量,但他們不返回。插入後我也試過選擇。不工作。我有一個稱爲insert_customer的過程,其中有幾個參數INOUT參數爲customer_id。但customer_id只是無法輸出。

這裏是上午例如我有:

CREATE OR REPLACE PROCEDURE insert_customer (
    p_corporate_key IN customers.corporate_key%TYPE, 
    p_fullname  IN customers.fullname%TYPE, 
    p_email   IN customers.email%TYPE, 
    p_phone   IN customers.phone%TYPE, 
    p_job_title  IN customers.job_title%TYPE, 
    p_department  IN customers.department%TYPE, 
    p_organization IN customers.organization%TYPE, 
    p_customer_id OUT customers.customer_id%TYPE 
) 
AS 
BEGIN 
    INSERT INTO customers (corporate_key, fullname, email, phone, job_title, department, organization) 
    VALUES (p_corporate_key, p_fullname, p_email, p_phone, p_job_title, p_department, p_organization) 
    RETURN customer_id INTO p_customer_id; 
EXCEPTION 
    WHEN OTHERS 
    THEN HTP.print(SQLERRM); 
END; 
/

BEGIN 
    ORDS.DEFINE_SERVICE(
     p_module_name => 'insert.customers' , 
     p_base_path => '/customers/', 
     p_method  => 'POST', 
     p_source  => ‘DECLARE 
          l_customer_id number; 
         BEGIN 
          insert_customer(p_corporate_key => :corporate_key, 
           p_fullname  => :fullname, 
           p_email   => :email, 
           p_phone   => :phone, 
           p_job_title  => :job_title, 
           p_department => :department, 
           p_organization => :organization 
           p_customer_id => :l_customer_id); 
         END;' 
    ); 

    COMMIT; 
END; 

customer_id是由觸發器產生的增量序列。

我想插入一個客戶(包含相關信息),然後返回customer_id


編輯:

我已經檢查的程序insert_customer單獨,它工作正常。

SQL>variable l_id number; 
SQL>exec insert_customer('a', 'a', 'a', 'a', 'a', 'a', 'a', :l_id); 

PL/SQL procedure successfully completed. 

SQL> print l_id 

     L_ID 
---------- 
     102 

的,我也於p_source添加

htp.prn(:corporate_key); 
htp.prn(:l_customer_id); 

htp.prn(:corporate_key); 
htp.prn(l_customer_id); 

insert_customer執行後,END之前。

但是,只打印出corporate_key,沒有l_customer_id

所以我想知道,分別輸出OUT參數值的程序,但不在ORDS的p_source內。

回答

0

好的,我已經解決了我的問題。

的問題是從這部分代碼:

BEGIN 
    ORDS.DEFINE_SERVICE(
     p_module_name => 'insert.customers' , 
     p_base_path => '/customers/', 
     p_method  => 'POST', 
     p_source  => ‘DECLARE 
          l_customer_id number; 
         BEGIN 
          insert_customer(p_corporate_key => :corporate_key, 
           p_fullname  => :fullname, 
           p_email   => :email, 
           p_phone   => :phone, 
           p_job_title  => :job_title, 
           p_department => :department, 
           p_organization => :organization 
           p_customer_id => :l_customer_id); 
         END;' 
    ); 

    COMMIT; 
END; 

在該行:p_customer_id => :l_customer_id

由於與:前綴變量被視爲脫離的p_source外部變量,如:corporate_key:fullname,但是,l_customer_id這裏內p_source聲明。所以,我需要做的只是去掉:在它的面前,並使用htp.prn打印出來,作爲如下:

BEGIN 
    ORDS.DEFINE_SERVICE(
     p_module_name => 'insert.customers' , 
     p_base_path => '/customers/', 
     p_method  => 'POST', 
     p_source  => ‘DECLARE 
          l_customer_id number; 
         BEGIN 
          insert_customer(p_corporate_key => :corporate_key, 
           p_fullname  => :fullname, 
           p_email   => :email, 
           p_phone   => :phone, 
           p_job_title  => :job_title, 
           p_department => :department, 
           p_organization => :organization 
           p_customer_id => l_customer_id); 
          htp.prn(''{"customer_id":"''||l_customer_id||''"}''); 
         END;' 
    ); 

    COMMIT; 
END; 

請求和響應:

POST /api/schema/customers/ HTTP/1.1 
Accept: application/json 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Length: xxx 
Content-Type: application/json 
Host: url:port 
User-Agent: HTTPie/0.9.4 

{ 
    "corporate_key": "a", 
    "department": "a", 
    "email": "a", 
    "fullname": "a", 
    "job_title": "a", 
    "organization": "a", 
    "phone": "a" 
} 

HTTP/1.1 200 OK 
Content-Type: text/html; charset=UTF-8 
Date: Thu, 09 Mar 2017 15:46:49 GMT 
Server: Jetty(9.2.z-SNAPSHOT) 
Transfer-Encoding: chunked  

{ 
    "customer_id": "130" 
} 
1

也許別人會添加更好的解決方案,但現在我會與你分享我們已經使用了很長一段時間,它的工作原理很好。

由於這是通過HTTP返回的,因此我們使用htp包。特別是prn程序。

l_response  := <your returned value>; 
htp.prn(l_response); 

一個警告在這裏,htp.prn只接受長達32K的字符串長度。爲此,如果要返回比(例如CLOB)長,你需要通過一個循環

例如,我們所說的循環過程在塊/程序結束做到這一點:

proc_send_clob_response(l_response); 

其中proc_send_clob_response定義如下:

PROCEDURE proc_send_clob_response(
            i_rest_response IN CLOB 
           ) 
AS 
    l_response_body_clob CLOB; 
    l_response_length  NUMBER; 
    l_response_buffer  VARCHAR2(32767); 
    l_response_chunk_size BINARY_INTEGER := 32000; 
    l_offset    INTEGER := 1; 

BEGIN 
    l_response_body_clob := i_rest_response; 
    dbms_lob.open(l_response_body_clob, dbms_lob.lob_readonly); 
    l_response_length := dbms_lob.getlength (l_response_body_clob); 

    WHILE (l_response_length > 0) 
    LOOP 
      dbms_lob.read(l_response_body_clob, l_response_chunk_size, l_offset, l_response_buffer); 

     htp.prn(l_response_buffer); 

     /* Increase Counter */ 
     l_offset := l_offset + l_response_chunk_size; 

     /* Resize CLOB length */ 
     l_response_length := l_response_length - l_response_chunk_size; 

    END LOOP; 

    dbms_lob.close(l_response_body_clob); 
EXCEPTION 
WHEN OTHERS THEN 
    --your exception handling here 
END; 

注意,我們使用htp.prn,而不是如htp.phtp.p在末尾添加新行\n,這時候我們contactentat的了,我們不渴望放入循環。

+0

我曾嘗試用自己的方式。但仍然沒有工作。請參閱我的問題的編輯部分。謝謝! – fluency03