2013-06-30 63 views
1

我有以下存儲過程語言支持生產pgsql的服務器:pgsql的存儲過程 - 內部,C或SQL語言是最好的?

  1. 內部
  2. Ç
  3. SQL

我找不到內部和c,只是PL/pgSQL的例子或在極少數情況下使用sql。我會盡量讓供應商來安裝其他語言,但供應商通常不提供的,所以我不認爲這會發生......所以,我stucked這些語言...

哪一個我應該選擇爲什麼? (如果你有一個很好的教程太多,那麼請把它寫在你的答案或評論)

select * from pg_language 

enter image description here

順便說一句我無法測試C和不教程內部,所以也許有一個簡單的解決方案:我不能使用它們,因爲它們不被信任。

編輯 - 解決方案

create language什麼爲我工作後。從那以後,我查了一下語言可供選擇用下面的查詢:

select * from pg_pltemplate 

enter image description here

你可以閱讀更多關於創建語言here

我會用PLPGSQL,我發現關於PostgreSQL的這裏一本好書:The PostgreSQL Programmer's Guide , Edited by Thomas Lockhart

+0

你確定*你沒有PL/pgSQL嗎?聽起來很奇怪,一個主機會允許C(可能會導致服務器崩潰)而不是PL/pgSQL。什麼是「內部」呢? –

+0

我編輯了我的問題。我會在星期一問他們,也許他們會安裝pl/pgsql。我不知道什麼是內部的,這是我的第一天用postgresql,我什麼都沒有發現關於C和內部,這就是爲什麼我問... – inf3rno

+0

哪個Postgres版本是這樣的? PL/pgSQL自9.0以來默認安裝 –

回答

2

看看pg_language的列表,它顯示了默認值:如果我使用createdb(PostgreSQL 8.4/Debian)創建新數據庫,則它是相同的輸出。此次上市可能已經包含另一行PL/pgSQL的,根據不同的版本和/或數據中心(由a_horse_with_no_name指出)。

所以,你必須

  • 「內置函數」(內部)
  • 「動態裝載的C函數」(三)
  • 「SQL語言函數」(SQL)

如果運行

CREATE LANGUAGE PLPGSQL;

會出現PL/pgSQL的另一行(如果您有privilege)。

比如你安裝了PL/Java的,你會得到

  • 「Java的信任」(JAVA)
  • 「的Java不可信」(javau)

這在顯示也列出。


一些準則作爲選擇語言

  • 如果你想有一個更高層次的語言,考慮斯卡拉(需要分別基於存儲過程的PL/Java或JVM的支持)。因此,不僅在SQL中,而且在存儲的函數/過程中都有功能範例。當然,就像Java一樣,你也有OOP。

  • 如果您正在使用Java,請查看Java存儲過程(需要PL/Java)。舉一個例子,看看here。與PL/pgSQL相比,您擁有完整的OOP。

PL/Java往往很難安裝,所以它並沒有真正被數據中心所賞識。這很麻煩,因爲您可以爲客戶端/應用程序服務器和存儲過程/函數使用相同的語言:無需學習其他語言。例如,您可以以相同的方式訪問結果集。唯一不同的是JDBC URL。與PL/pgSQL相比,如果其他數據庫也支持基於JVM的存儲過程,則這些存儲過程是可移植的。

  • 如果你要選擇一個從已經可用的語言,考慮PL/pgSQL的。它通常總是安裝,你不必處理內存分配。

  • 如果您必須與操作系統/庫進行接口,則有C。要獲得印象,請看here。這並不是很難,它只是更多的功能。

  • 如果你想C++,它變得更難,因爲PostgreSQL和C/C++模塊之間的接口使用C調用約定,所以你應該有哪些PostgreSQL和你的C++模塊間位於C文件。要獲得印象,請看here

如果不使用PL/pgSQL的,最困難的部分是安裝(PL /爪哇),和所述接口代碼(PL/Java的,PL/C,PL/C++)。如果您最初設置了它,那麼真的很高興在存儲過程/函數中擁有您真正想要的語言。這是值得的麻煩。

+0

同時我檢查lanpltrusted意味着它只能由超級用戶運行,所以我沒有c和內部的權限......所以唯一的語言我目前可以運行的是sql。它是否能夠例如循環? MySQL有能力,但它沒有獨立的過程語言......我想我會打電話給提供者...... – inf3rno

+1

「普通」(即默認)安裝應該也列出PL/pgSQL。自9.0版以來,每個版本都默認安裝該版本。您必須主動*從默認安裝中刪除* PL/pgSQL。 –

+0

@a_horse_with_no_name感謝您的提示,我已經更新了我的答案。 – Beryllium

1

如果從一些軟件工具訪問數據庫(例如,從通過JDBC JAVA)也發展,這可能是更好的簡化查詢,在客戶端做更多工作並避免數據庫端腳本。

基本原理是這些服務器端腳本更難以測試(單元測試需要數據庫),調試(通常對於調試器中您自己的代碼更復雜)以及維護(升級等)。在服務器端腳本錯誤往往被忽視,較長時間被分開, 這些腳本只是偶爾由客戶端開發人員看到。

但是,如果反正首選,我們使用PL/PSQL在過去,因爲它可能有在服務器上剛剛經歷JDBC連接自動安裝所有代碼的自動腳本。

+3

代碼是代碼,不管它是什麼語言。數據庫代碼與Java測試一樣複雜。 .net或其他。你只需要工具和技能。 –

+0

對不起Audrius,但我不能接受這個。我清楚地寫下了我的選擇,PL/PSQL不是其中之一。我已經知道存儲過程的缺點和優點。 – inf3rno

+1

隨着技術的存在,他們可能有他們的應用領域。從你的問題不明顯,爲什麼PL/PSQL不適合你,但它當然可能是真實的。 – h22

3

通常情況下,你可以使用四,五PL語言 - SQL,PL/pgSQL中,PL/Python或PL/Perl裏,C

  • SQL - 短一行的功能 - 可以超快速由於內聯(如宏)
  • PL/pgSQL - 適用於業務邏輯實現(如果您喜歡它,它可以加速您的應用程序到期:網絡流量更少,數據類型轉換更少,進程間通信更少 - PLpgSQL使用與Postgres兼容的類型並且函數在PostgreSQL SQL executor進程中執行) - 適用於有很多SQL查詢的代碼,這是由於SQL的本地支持(您可以喜歡它,或者您可以更喜歡ORM - 我個人不喜歡ORM - 它是主要表現殺手我所知道的)。 012/PL/Python/PL/Perl - 適用於PL/pgSQL不好或錯過必要特性的特殊任務 - 我喜歡PL/Perl在PostgreSQL中可能使用CPAN存檔 - 需要發送main或需要執行SOAP調用 - 全部在CPAN中。
  • C - 需要最高性能或訪問PostgreSQL內部 - 然後使用C函數。一些通用字符串,日期,數學例程的快速實現是C語言中最簡單的。章C代碼

例子,你可以在

C L找到語言可用於實現自己的數據類型,必要的操作和索引支持。您可以找到很多PostgreSQL擴展 - 非常有名的是PostGIS。

相關問題