PL SQL指令碼的錯誤控制

2021-03-31 23:03:04 字數 3477 閱讀 7376

要想檢測從 

postgres 伺服器來得錯誤,你要包含如下一行

exec sql include sqlca;
到你的檔案的包含段裡.這樣做將會定義乙個結構和乙個象下面一樣名為

sqlca

的變數:

struct sqlca

sqlerrm;

char sqlerrp[8];

long sqlerrd[6];

/* 0: empty                                         */

/* 2: number of rows processed in an insert, update */

/*    or delete statement                           */

/* 3: empty                                         */

/* 4: empty                                         */

/* 5: empty                                         */

char sqlwarn[8];

/* 0: set to 'w' if at least one other is 'w'       */

/* 1: if 'w' at least one character string          */

/*    value was truncated when it was               */

/*    stored into a host variable.                  */

/* 2: empty                                         */

/* 3: empty                                         */

/* 4: empty                                         */

/* 5: empty                                         */

/* 6: empty                                         */

/* 7: empty                                         */

char sqlext[8];

} sqlca;

如果最後乙個

sql 語句發生了錯誤,那麼

sqlca.sqlcode

將是非零值.如果

sqlca.sqlcode

小於 0 那麼就是發生了某種嚴重的錯誤,象資料庫定義與查詢定義不一致等.如果大於 0 則是通常的錯誤,象表不包括所要求的行等.

sqlca.sqlerrm.sqlerrmc 將包含乙個字串描述該錯誤.該字串以原始檔的行號結尾。

可能發生的錯誤列表:

-12, out of memory in line %d.

通常不出現這個錯誤。這是你的虛擬記憶體耗盡的標誌。

-200, unsupported type %s on line %d.

通常不出現這個錯誤.這表明預編譯器生成了一些庫(函式)不認得的東西.可能你執行的預編譯器和當前庫不相容.

-201, too many arguments line %d.

這意味著 

postgres 返回了比我們的匹配變數更多的引數.可能你漏了幾個into :var1,:var2-列表裡的宿主變數.

-202, too few arguments line %d.

這意味著 

postgres 返回了比我們的對應宿主變數要少的引數.可能你多輸入了幾個into :var1,:var2-列表裡的宿主變數.

-203, too many matches line %d.

這意味著查詢返回了多個行,但你宣告的變數不是陣列.你執行的select可能不是唯一的.

-204, not correctly formatted int type: %s line %d.

這意味著宿主變數是乙個 

int 型別並且 

postgres 資料庫裡的字段是另一種型別,包含著乙個不能轉換成乙個 

int 型別的數值.庫(函式)使用

strtol 做此類轉換.

-205, not correctly formatted unsigned type: %s line %d.

這意味著宿主變數是乙個 

unsigned int(無符號整數)型別而

postgres 資料庫裡的字段是另外一種型別並且包含乙個不能轉換成

unsigned int 的數值.庫(函式)使用

strtoul 做這類轉換.

-206, not correctly formatted floating point type: %s line %d.

這意味著宿主變數是乙個 

float (浮點)型別而 

postgres 資料庫裡的字段是另外一種型別並且包含乙個不能轉換成

float 的數值.庫(函式)使用

strtod 做這類轉換.

-207, unable to convert %s to bool on line %d.

這意味著宿主變數是乙個 

bool (布林)型別,而 

postgres 資料庫裡的字段值既不是 't' 也不是 'f'。

-208, empty query line %d.

postgres 返回 pgres_empty_query,可能的原因是該查詢實際上是空的。

-220, no such connection %s in line %d.

程式試圖訪問乙個不存在的聯接。

-221, not connected in line %d.

程式試圖訪問乙個存在的,但是沒有開啟的聯接。

-230, invalid statement name %s in line %d.

你試圖使用的語句還沒準備好。

-400, postgres error: %s line %d.

某種 

postgres 錯誤。該訊息包含來自 

postgres 後端的資訊。

-401, error in transaction processing line %d.

postgres 給我們的訊號,表明我們無法開始,提交或者回卷該事務。

-402, connect: could not open database %s.

與資料庫的聯接無法工作。

100, data not found line %d.

這是乙個"正常的"錯誤,告訴你你正在查詢的東西找不到或者我們已經越過了游標的範圍。

關於shell中的pl sql指令碼錯誤排查與分析

今天有個同事問我乙個問題,他說執行shell指令碼的時候丟擲了ora 錯誤,但是對於錯誤的原因沒有思路,想讓我幫他看看。我檢視了下,指令碼的結構比較清晰。指令碼是有乙個shell指令碼,乙個sql檔案組成,shell指令碼作為基本的流程控制,sql檔案中是pl sql指令碼。大體明白了shell指令...

PLSQL錯誤總結

1 is null為true,和null是同乙個東西。神經病寫法 無論vc itemids是null還是 or後面的那一句都為false,判空只能使用is null 或者 is not null。下面的vc itemids只需要前面的判空就可以了。分析 2.低效的子查詢 神經病寫法 子查詢並沒有用到...

PLSQL的迴圈控制

1.if declare v count number 10 0 定義計數器變數 v empno number 4 7888 定義員工編號 begin select count 1 首先查詢指定的員工編號是否存在 into v count from emp where empno v empno 使...