最近安裝了datagrip操做達夢數據庫,發現有一個問題:dagagrip沒法獲取dbms_output的輸出,在oracle是能夠的,但在達夢不行。sql
因而聯想到一個問題:c語言裏面怎麼獲取dbms_output的輸出?數據庫
百度了一下,沒有找到明確的答案,可是找到了jdbc獲取dbms_output輸出的方法: 連接見這裏 https://blog.csdn.net/jswxharry/article/details/7861666oracle
大概原理是使用dbms_output.getline函數獲取dbms_output的輸出,並保存到存儲過程出參。使用jdbc獲取對應參數的值便可。函數
getline的示例用法:工具
declare line varchar2(100); status number; begin dbms_output.enable; dbms_output.put_line('偉大的中華民族'); dbms_output.put('中國'); dbms_output.put(',偉大的祖國'); dbms_output.get_line(:line,:status); -- get_line返回後若是status爲1表明失敗 dbms_output.put_line('put_line ' || :status); dbms_output.put_line('put_line ' || :line); end;
輸出:oop
put_line 0
put_line 偉大的中華民族測試
c語言要獲取dbms_output的輸出,想來也可使用相似的方法。不過這個方法使用起來稍有點麻煩,我想出了一個優化方法:優化
c語言獲取某個sql的返回結果是比較方便的,我只要把dbms_output的輸出轉換到一張表裏面,再對該表作查詢便可。.net
爲此,我建了一張表tb_dbms_output,用於存放dbms_output的輸出,而且寫了一個簡單的存儲過程,做用是獲取dbms_output的輸出,把它們登記到tb_dbms_outputcode
詳細代碼以下:
Create Global Temporary Table tb_dbms_output -- 皇家救星:tb_dbms_output 是一張事務級別的臨時表,只要一提交事務,就會自動清空。 ( line number, output_text varchar2(4000) ) On Commit Delete Rows; create index idx_tb_dbms_output_line on tb_dbms_output(line); select * from tb_dbms_output; -- 須要同時選擇11~28行運行,分開運行不能獲取結果 begin dbms_output.put_line('1334'); end; / declare status number := 0; output_text varchar2(4000); line number := 1; begin loop status := 0; dbms_output.get_line(output_text, status); exit when status = 1; insert into tb_dbms_output values(line, output_text); line := line + 1; end loop; end; / select * from tb_dbms_output order by 1; -- kingstarer: commit;
以上代碼在plsql developer和達夢數據庫管理工具測試,都可獲得預期結果。
但願這篇文章對你有幫助。