當前位置:首頁 » 編程語言 » 資料庫嵌入式sql章節測驗
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫嵌入式sql章節測驗

發布時間: 2023-04-08 08:39:37

㈠ 第三章 sql語言元素(一)

InterSystems SQL命令(也稱為SQL語句)以關鍵字開頭,後跟一個或多個參數。其中一些參數可能是子句或函數,由它們自己的關鍵字標識。

InterSystems SQL關鍵字包括命令名稱,函數名稱,謂詞條件名稱,數據類型名稱,欄位約束,優化選項和特殊變數。它們還包括 AND , OR 和 NOT 邏輯運算符, NULL 列值指示符以及ODBC函數構造,例如 {d dateval} 和 {fn CONCAT(str1,str2)} 。

聚合函數是SQL固有函數,它計算列的所有值並返回單個聚合值。

這種寫法只能在mac routine里,類文件里編譯報錯。

如果將用戶提供的(外部)函數的使用配置為系統范圍的選項,則該SQL語句只能調用用戶提供的(外部)函數。默認為「否」。默認情況下,嘗試調用用戶提供的函數會發出 SQLCODE -372 錯誤。可以使用 %SYSTEM.SQL類的SetAllowExtrinsicFunctions() 方法在系統范圍內配置SQL對外部函數的使用。若要確定當前設置,請調用 $SYSTEM.SQL.CurrentSettings() ,該顯示顯示「允許在SQL語句中使用外部函數」選項。

不能使用用戶提供的函數來調用 %routine (名稱以%字元開頭的常式)。
嘗試這樣做會發出 SQLCODE -373 錯誤。

InterSystems SQL文字具有以下語法:

文字是一系列代表實際(文字)值的字元。它可以是數字或字元串。

空字元串是文字字元串;它由兩個單引號字元( '' )表示。 NULL 不是文字值;它表示沒有任何值。

注意:在嵌入式SQL中,不允許在字元串文字中使用以 ## 開頭的一些字元序列,如「使用嵌入式SQL」一章的「文字值」中所述。此限制不適用於其他SQL調用,例如動態SQL。

使用單引號( ' )字元作為字元串定界符。 SQL兼容性支持雙引號字元( 「 )的使用,但由於與定界標識符標准沖突,因此強烈建議不要使用。將一對雙引號字元 "" 解析為無效的定界標識符。並生成 SQLCODE -1 錯誤。

要在字元串中指定單引號字元作為字面字元,請指定一對這樣的字元作為字面轉義序列。
例如, 'a 'normal' string' 。

雙豎條( || )是首選的SQL連接操作符。
它可以用於連接兩個數字、兩個字元串或一個數字和一個字元串。

下劃線( _ )作為SQL連接操作符提供,以保證ObjectScript的兼容性。
此連接操作符只能用於連接兩個字元串。

如果兩個操作數都是字元串,並且兩個字元串都具有相同的排序規則類型,則所得的級聯字元串具有該排序規則類型。在所有其他情況下,連接的結果是排序類型 EXACT 。

使用 NULL 關鍵字表示沒有指定值。
在SQL中, NULL 始終是表示數據值因任何原因未指定或不存在的首選方式。

SQL零長度字元串(空字元串)由兩個單引號字元指定。
空字元串( " )與空字元串是不同的。
空字元串是一個已定義的值,一個不包含字元的字元串,一個長度為0的字元串。
一個零長度的字元串在內部由非顯示字元 $CHAR(0) 表示。

注意:不建議使用SQL零長度字元串作為欄位輸入值或欄位默認值。
使用 NULL 表示數據值的缺失。

在SQL編碼中應避免使用SQL零長度字元串。
但是,由於許多SQL操作都會刪除末尾的空格,所以只包含空格字元(空格和製表符)的數據值可能會導致SQL的零長度字元串。

注意,不同的SQL length函數返回不同的值: length 、 CHAR_LENGTH 和 DATALENGTH 返回SQL長度。
$LENGTH 返回ObjectScript表示長度。
長度不計算尾隨空格;
所有其他長度函數都計算末尾的空格。

NOT NULL數據約束要求欄位必須接收一個數據值;
不允許指定NULL而不是值。
這個約束不阻止使用空字元串值。

SELECT 語句的 WHERE 或 HAVING 子句中的 IS NULL 謂詞選擇空值;
它不選擇空字元串值。

IFNULL 函數計算一個欄位值,如果欄位值為 NULL ,則返回第二個參數中指定的值。
它不會將空字元串值視為非空值。

COALESCE 函數從提供的數據中選擇第一個非空值。
它將空字元串值視為非空值。

當 CONCAT 函數或 concenate 操作符( || )連接一個字元串和一個 NULL 時,結果是 NULL 。
如下面的例子所示:

AVG、COUNT、MAX、MIN 和 SUM 聚合函數在執行操作時忽略 NULL 值。
( COUNT * 統計所有行,因為不可能有一個所有欄位都為空值的記錄。)
SELECT 語句的 DISTINCT 關鍵字在其操作中包含 NULL ;
如果指定的欄位有空值, DISTINCT 返回一個空行.

AVG 、 COUNT 和 MIN 、聚合函數受空字元串值的影響。
MIN 函數將空字元串視為最小值,即使存在值為0的行。
MAX 和 SUM 聚合函數不受空字元串值的影響。

對大多數SQL函數提供 NULL 作為操作數將返回 NULL 。

任何以NULL作為操作數的SQL算術操作都返回 NULL 值。
因此,7 +零=零。
這包括二元運算加法( + )、減法( - )、乘法( * )、除法( / )、整數除法( )和取模( # ),以及一元符號運算符加號( + )和減號( - )。

算術操作中指定的空字元串將被視為0(零)值。
除法( / ),整數除法( ),或對空字元串( 6/ " )取模( # )會導致 <DIVIDE> 錯誤。

在SQL中, NULL 的長度是沒有定義的(它返回 < NULL > )。
然而,空字元串的長度被定義為長度為0。
如下面的例子所示:

如本例所示,SQL LENGTH 函數返回SQL長度。

可以使用 ASCII 函數將SQL的零長度字元串轉換為 NULL ,示例如下:

但是,對標准 SQL 的某些系統間IRIS擴展對 NULL 和空字元串的長度的處理是不同的。
$LENGTH函數返回這些值的InterSystems IRIS內部表示: NULL 表示為長度為0的已定義值,SQL空字元串表示為長度為0的字元串。
該功能與ObjectScript兼容。

這些值的內部表示方式的另一個重要位置是 %STRING 、 %SQLSTRING 和 %SQLUPPER 函數,它們將空格附加到值中。
因為 NULL 實際上沒有值,所以在它後面添加一個空格會創建一個長度為1的字元串。
但是一個空字元串確實有一個字元值,所以在它後面加上一個空格會創建一個長度為2的字元串。
如下面的例子所示:

注意,這個例子使用的是 CHAR_LENGTH ,而不是 LENGTH 。
因為 LENGTH 函數刪除了末尾的空格,所以 LENGTH(%STRING(NULL)) 返回長度為0的字元串;
LENGTH(%STRING(")) 返回長度為2的字元串, 因為 %STRING 追加的是前導空格,而不是尾隨空格。

當SQL NULL 輸出到ObjectScript時,它由ObjectScript空字元串( "" )表示,長度為0的字元串。

當SQL零長度字元串數據輸出到ObjectScript時,它由包含 $CHAR(0) 的字元串表示,該字元串長度為1。

在ObjectScript中,沒有值通常用空字元串( "" )表示。
當這個值被傳遞到嵌入式SQL中時,它會被視為空值,如下面的例子所示:

如果指定了一個未定義的輸入主機變數,嵌入式SQL將其值視為 NULL 。

當將NULL或空字元串值從嵌入式SQL傳遞到ObjectScript時, NULL 被轉換為長度為0的字元串,空字元串被轉換為長度為1的字元串。
如下面的例子所示:

在下面的例子中,SQL的空字元串加上一個空格被傳遞為長度為2的字元串:

㈡ 第142章 SQL函數 TO_CHAR(三)

以下嵌入式 SQL 示例顯示了基本的數字到字元串的轉換:

返回具有適當數量的前導空格的指定數字。無符號正數前面總是有一個空白字漏衡賣符。如果指定數字的位數少於格式參數,則提供額外的前導空格。

以下嵌入式 SQL 示例顯示了分隔符的使用:

第一個 TO_CHAR 返回字元串 '1,000.00' ;。第二個 TO_CHAR 也可能返回此值,但顯示的分隔符取決於區域設置。

以下嵌入式 SQL 示例顯示了正號和負號的使用:

請注意,前導空格攔陸僅出現在沒有符號格式的正數之前。無論符號的位置如何,負數或任何帶符號的數字之前都不會出現前導空格。

以下嵌入式 SQL 示例顯示了使用「FM」格式覆蓋無符號正返逗數的默認前導空白:

以下嵌入式 SQL 示例顯示了前導美元符號的使用:

美元符號前面總是有一個符號或一個空白字元。

以下嵌入式 SQL 示例顯示了當 format 參數包含的整數位數少於輸入數值時會發生什麼:

每個 TO_CHAR 分別返回一串井號: 「##」 、 「###」 和 「######」 。

以下嵌入式 SQL 示例顯示了當 format 參數包含的十進制(小數)位數少於輸入數值表達式時會發生什麼:

返回的數字分別四捨五入為 「1234567.5」 和 「1234568」 。

㈢ 北京理工大學遠程教育學院.計算機專業.資料庫技術與應用在線作業求答案

理工網路教育的卷子,沒有標准答案。需要他人幫做各種作業,就加一下本人吧。

㈣ 靜態SQL和動態SQL的區別和測試實例

所謂SQL的動態和靜態,是指SQL語句在何時被編譯和執行,二者都是用在SQL嵌入式編程中的。
靜態SQL:在高級語言中,如果嵌入了SQL語句,而這個SQL語句的主體結構已經明確,例如在c的一段代碼中有一個待執行的SQL「select * from t1 where c1>5」,在編譯階段,就可以將這段SQL交給資料庫管理系統去分析,資料庫軟體可以對這段SQL進行語法解析,生成資料庫方面的可執行代碼,這樣的SQL稱為靜態SQL,即在編譯階段就可以確定資料庫要做什麼事情。
動態SQL:如果嵌入的SQL沒有明確給出,如在c中定義了一個字元數組類型的變數name:char name[32];,然後採用prepared Statement對象的execute方法去執行這個sql,該sql的值可能等於從文本框中讀取的一個SQL或者從鍵盤輸入的SQL,但具體是什麼,在編譯時無法確定,只有等到程序運行起來,在執行的過程中才能確定,這種SQL叫做動態SQL。例如每一種資料庫軟體都有能夠執行SQL語句的界面,那個界面接收的SQL就是動態SQL,因為資料庫廠商在做這個界面時,並不知道用戶會輸入哪些SQL,只有在該界面執行後,接收了用戶的實際輸入,才知道SQL是什麼。
注意:在SQL中如果某些參數沒有確定,如」select * from t1 where c1>? and c2#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

EXEC SQL INCLUDE SQLCA;
EXEC SQL INCLUDE SQLDA;
/*此函數屬於靜態SQL編程*/
int DBSelect_static(){
EXEC SQL BEGIN DECLARE SECTION;
char _typename[32];
short _length;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT typename,length
INTO :_typename,:_length
FROM syscat.columns
WHERE tabname='SYSCOLUMNS' and colname='DEFAULT';
printf("【typename:%s】【length:%d】\n",_typename,_length);
}
/*此函數屬於靜態SQL編程:指定函數參數作為SQL語句的變數*/
int DBSelect_static_param(char *tbl_str,char *col_str){
EXEC SQL BEGIN DECLARE SECTION;
char _typename1[32];
short _length1;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT typename,length
INTO :_typename1,:_length1
FROM syscat.columns
WHERE tabname='tbl_str' and colname='col_str';
printf("【typename:%s】【length:%d】\n",_typename1,_length1);
}
/*此函數屬於動態SQL編程:SQL語句的結構是不確定的,需要根據用戶的輸入補全SQL語句*/
int DBUpdate_dynamic(){
EXEC SQL BEGIN DECLARE SECTION;
char _address1[32];
char _tablename[32];
char _tmp[32];
char buf[256];
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT count(address1) INTO :_tmp FROM cisaddressinfo WHERE customid='100000100000000000178';
if(0==_tmp) {printf("Not Found!\n");return -1;}
memset(buf,0x00,sizeof(buf));
sprintf(buf,"update ");
printf("Pls input : tablename ->");
scanf("%s",&_tablename);
strcat(buf,_tablename);
strcat(buf," set address1=? where customid='100000100000000000178'");
EXEC SQL PREPARE project FROM :buf;
if(sqlca.sqlcode) perror("PREPARE");
printf("Pls input : address1 ->");
scanf("%s",&_address1);
EXEC SQL EXECUTE project USING :_address1;
if(sqlca.sqlcode) perror("EXECUTE");
EXEC SQL COMMIT WORK;
if(sqlca.sqlcode) perror("COMMIT");
}
/*此函數屬於動態SQL編程:使用sqlda數據結構組裝復雜多變的動態SQL*/
int DBSelect_dynamic(){
EXEC SQL BEGIN DECLARE SECTION;
char hostVarStmt[256];
EXEC SQL END DECLARE SECTION;
// 聲明兩個 SQLDA 指針,minsqlda 將是一個最小的 SQLDA 結構,用於 PREPARE 語句,
// 此時結果集的欄位數量未知,所以只需一個最小的 SQLDA,即包含 HEADER 和一個 SQLVAR
struct sqlda * minsqlda = (struct sqlda*)malloc(SQLDASIZE(1));
struct sqlda * fulsqlda = NULL;

strcpy(hostVarStmt, "select WUID from workprocess where muid = '185001'");
// PREPARE 將填寫 minsqlda 的 header,sqldabc 為 SQLDA 總長度,sqln 為 SQLVAR 數量,即欄位數量
EXEC SQL PREPARE STMT INTO :*minsqlda FROM :hostVarStmt;
// 根據從 minsqlda 中獲取的長度,分配完整的 SQLDA 結構 fulsqlda,其中將包括合適數量的 SQLVAR 結構
//結構sqlda的成員變數sqld返回select查詢語句的欄位的數目,可以根據此變數分配內存
fulsqlda = (struct sqlda *)malloc(SQLDASIZE(minsqlda->sqld));
// 使用 DESCRIBE 語句,獲取結果集中每個欄位的描述信息,包括各欄位的類型 (sqltype) 和長度 (sqllen)
EXEC SQL DESCRIBE STMT INTO :*fulsqlda;
int i;
for(i=0;i<minsqlda->sqld;i++)
{
// 根據每個欄位的長度,分配內存,將地址存儲在對應 SQLVAR 的 sqldata 中
// fulsqlda->sqlvar[i].sqldata=malloc(fulsqlda->sqlvar[i].sqllen);
fulsqlda->sqlvar[i].sqldata=malloc(32);
fulsqlda->sqlvar[i].sqlind=malloc(sizeof(short));
}

// 聲明游標
EXEC SQL DECLARE c1 CURSOR FOR STMT;
EXEC SQL OPEN c1;

EXEC SQL WHENEVER not found goto no_more_data;
// 讀取記錄,記錄中每個欄位的內容將寫入 fulsqlda 中對應 SQLVAR 結構的 sqldata 指向的內存
// EXEC SQL FETCH c1 USING DESCRIPTOR :*fulsqlda;
// 循環讀取所有記錄
for (;;)
{
EXEC SQL FETCH c1 USING DESCRIPTOR :*fulsqlda;
for(i=0;i<minsqlda->sqld;i++){
printf("%d %s\n",fulsqlda->sqlvar[i].sqltype,fulsqlda->sqlvar[i].sqldata);
usleep(10000);
}
}
return 0;
no_more_data:
printf("\nEND of Data\n");
free(minsqlda);
free(fulsqlda);
EXEC SQL CLOSE c1;
return 0;
}
int main(){
/*連接資料庫*/
EXEC SQL CONNECT TO ezeelink USER ezeelink USING EA704075ezeelink;
DBSelect_static();
DBSelect_static_param("SYSCOLUMNS","DEFAULT");
DBUpdate_dynamic();
DBSelect_dynamic();

no_more_data:
;

return 0;
}

案例輸出結果如下:
【typename:VARCHAR】【length:254】
【typename:VARCHAR】【length:254】
Pls input : tablename ->cisaddressinfo
Pls input : address1 ->ShangHai
452 cis505
452 cis506
452 pub806
452 ips007
452 ips032
452 dps302
END of Data
注意:
如果使用動態SQL編程編寫select查詢語句並保存結果,需要使用sqlda數據結構的,同時使用SQL的特性和功能,如:PREPARE ,EXECUTE ,DESCRIBE , DECLARE CURSE C1 FOR … , OPEN CURSE , CLOSE CURSE ….等等
建議:
動態SQL適用於表名及查詢欄位名未知的情況。在已知查詢欄位名及表名的情況下,使用動態SQL(字元串拼接方式)會增加硬解析的開銷,在這種情況下,建議使用靜態SQL,這樣可以提高執行效率。在過程過程用拼湊的動態sql效率並不高,有時候還不如程序直接傳遞sql.靜態SQL是前置編譯綁定,動態SQL是後期執行時才編譯綁定

㈤ C語言中使用嵌入式sql

嵌入式SQL程序的VC+SQL server 2000實現的環境配置

嵌入SQL的C應用程序具體到VC++6.0, SQL Server2000 下調試可分為五步:1、環境初始化;2、預編譯;3、編譯;4、連接;5、運行。下面就其中重要的的操作方法給以詳細說明。
1、環境初始化
(1) SQL Server2000為其嵌入式SQL提供了一此特殊的介面;默認的安裝方式沒有安裝這此介面;因此,需要把devtools.rar解壓到SQLServer的系統日錄下(即文件夾devtools中的所有文件);如果操作系統安裝在C盤,則SQL Server的系統目錄是C:\Program Files\Microsoft SQL Server。(或 在安裝Microsoft SQL Server 2000時選擇安裝Development Tools,為使用嵌入式SQL語言准備必要的頭文件和庫文件。)
( 2)初始化Visual C++ 6.0編譯器環境。在命令行方式下運行文件\Microsoft Visual Studio\VC98\Bin\vcvars32.bat。
(3)初始化SQL Server的預編譯環境。在命令行方式下運行文件:\Devtools\samples\esqlc\setenv.bat。
( 4) VC++6.0環境配置。具體配置分為如下三步[:
①Tools->options->directories->Include Files:添加 C:\Program Files\Microsoft SQL Server\devtools\include。將SQL server自帶的用於資料庫開發的頭文件包含到工程環境中。
②Tools->options->directories->Lib Files:添加C:\Program Files\Microsoft SQL Server\devtools\x861ib。將開發用到的包包含到工程中。
③project->Settings->Link->Object/Library Moles,添加庫文件:SQLakw32.lib, Caw32.lib。這兩個文件之間用空格分開。

2、預編譯
C語言編譯程序不能識別應用程序中的SQL語句,需要經過預處理程序將其轉換成C語句。SQL Server的預處理程序是nsqlprep.exe。 nsqlprep.exe在SQL Server安裝日錄的MSSQL\Binn下。若SQL Server資料庫採用的是默任安裝方式,則需要把binn.rar的內容拷貝到指定目錄下。

Microsoft SQL Server 2000提供的預編譯程序nsqlprep.exe,用於對嵌入式SQL程序進行預編譯處理,生成C語言源程序.實際上就是將嵌入式SQL程序中的嵌入式SQL語句替換為對運行時庫文件Sqlakw32. dll的函數調用,接著運行時庫文件調用動態連接庫Ntwdblib. dll通過網路來存取Microsoft SQL Server 2000資料庫伺服器.
預編譯程序nsqlprep的常用語法為:
nsqlprep ESQL_File /SQLACCESS /DB server_name.database_name /PASS login.password
其中ESQL_File是要預編譯的嵌入式SQL程序;/SQLACCESS通知nsqlprep自動地為嵌入式SQL程序中的靜態SQL語句創建相應的存儲過程;/DB server_name.database_name指明要連接的伺服器以及資料庫名稱;/PASS login.password給出登錄名及相應的口令.

下面的程序demo.sqc實現了從資料庫伺服器hushaobo的資料庫pubs中的authors表中讀取au_lname為white的人對應的 au_fname 值,並保存到變數first_name 中顯示出來。(連接資料庫的用戶為sa,對應密碼為1982)

#include<stdio.h>
void main()
{
EXEC SQL BEGIN DECLARE SECTION;
char first_name[40];
char last_name[]="White";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO hushaobo.pubs
USER sa.1982;
EXEC SQL SELECT au_fname INTO :first_name from authors WHERE au_lname = :last_name;
EXEC SQL DISCONNECT ALL;
printf("first name: %s \n",first_name);
}

在命令行下運行:nsqlprep demo.sqc /SQLACCESS /DB hushaobo.pubs /PASS sa.1982
則生成demo.c,將該文件添加到VC工程中編譯即可。

3、編譯,連接與運行
在VC++6.0中創建一個 "WIN32 Console Application"的Proiect,然後將預編譯生成的c文件加入Proiect,編譯連接即可生成訪問SQL Server的可執行程序。 Visual C++ 6.0進行編譯連接時需要用到動態鏈接庫SQLakw32.d11與SQLaiw32.d11;盡管這兩個文件已經隨同binn.rar被拷貝到SQLServer安裝目錄的MSSQL\Binn文件夾下,但仍然需要把它們的路徑加到系統路徑變數中,以使得程序運行時能找到它們,具體添加方法如下:
方法1:把這兩個文件拷貝到操作系統目錄下的system32子目錄中。
方法2:我的電腦->屬性->高級->環境變數->path->編輯,在變數值中加入路徑值;新路徑與已有路徑間用;間隔。

注意調適程序時,文件名中不要包含cursor,否則可能會出錯。

㈥ 資料庫嵌入式sql編程,求解

題目沒有說明表之間的外鍵關系,那我就默認同名的列名是外鍵,不清楚你用的編程語言,所以我使用:input作為輸入變數
1
select Teacher.Tname,Teacher.Tage,Teacher.Tsex,Work.Salary from Teacher,Work,Department
where Teacher.Tno=Work.Tno and Department.Dno=Work.Dno
and Department.Tno=Teacher.Tno and Work.Salary>:input
2
update Work set Salary=:input from Teacher,Department
where Teacher.Tno=Work.Tno and Department.Dno=Work.Dno
and Department.Tno=Teacher.Tno and Work.Salary<:input

㈦ 互動式SQL與嵌入式SQL有什麼不同

1、語言不同

互動式SQL是指在終端交互方式下使用的SQL語言稱為互動式SQL;嵌入式SQL是一種將SQL語句直接寫入C語言,COBOL,FORTRAN, Ada等編程語言的源代碼中的方法。

2、使用不同

互動式SQL是在終端交互方式下使用;嵌入式SQL是嵌入在高級語言的程序中使用。

(7)資料庫嵌入式sql章節測驗擴展閱讀:

提供對於嵌入式SQL的支持,需要資料庫廠商除了提供DBMS之外,還必須提供一些工具。為了實現對於嵌入式SQL的支持,技術上必須解決以下4個問題:

1、宿主語言的編譯器不可能識別和接受SQL文,需要解決如何將SQL的宿主語言源代碼編譯成可執行碼;

2、宿主語言的應用程序如何與DBMS之間傳遞數據和消息;

3、如何把對數據的查詢結果逐次賦值給宿主語言程序中的變數以供其處理;

4、資料庫的數據類型與宿主語言的數據類型有時不完全對應或等價,如何解決必要的數據類型轉換問題。

嵌入式SQL源碼的處理流程 為了解決上述這些問題,資料庫廠商需要提供一個嵌入式SQL的預編譯器,把包含有嵌入式SQL文的宿主語言源碼轉換成純宿主語言的代碼。

這樣一來,源碼即可使用宿主語言對應的編譯器進行編譯。通常情況下,經過嵌入式SQL的預編譯之後,原有的嵌入式SQL會被轉換成一系列函數調用。因此,資料庫廠商還需要提供一系列函數庫,以確保鏈接器能夠把代碼中的函數調用與對應的實現鏈接起來。