如何从Lisp运行Oracle plsql过程?

时间:2020-03-05 18:54:25  来源:igfitidea点击:

我该如何开始?

解决方案

回答

我们将需要一个Oracle SQL数据库接口。正如鲍勃指出的那样,Allegro CL具有这样的接口。

GNU CLISP显然也带有数据库接口。

回答

从Common Lisp程序中完成Oracle工作的最直接方法是使用CLSQL。还有许多其他软件包可用于处理Common Lisp中的数据库。看看Cliki的数据库页面

回答

我找到了使用Clojure实现此目的的最简单方法。
这是示例代码:

(ns example
  (:require [clojure.contrib.sql :as sql])
  (:import  [java.sql Types]))

(def devdb {:classname "oracle.jdbc.driver.OracleDriver"
            :subprotocol "oracle"
            :subname "thin:username/password@localhost:1509:devdb"
            :create true})

(defn exec-ora-stored-proc [input-param db callback]
  (sql/with-connection db
    (with-open [stmt (.prepareCall (sql/connection) "{call some_schema.some_package.test_proc(?, ?, ?)}")]
      (doto stmt
        (.setInt               1 input-param)
        (.registerOutParameter 2 Types/INTEGER)
        (.registerOutParameter 3 oracle.jdbc.driver.OracleTypes/CURSOR)
        (.execute))
      (callback (. stmt getInt 2) (. stmt getObject 3)))))

(exec-ora-stored-proc
 123 ;;input param value
 devdb
 (fn [err-code res-cursor]
   (println (str "ret_code: " err-code))
   ;; prints returned refcursor rows
   (let [resultset (resultset-seq res-cursor)]
     (doseq [rec resultset]
       (println rec)))))