版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程第八章 數(shù)據(jù)庫編程8.1 嵌入式嵌入式SQL數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1 嵌嵌 入入 式式 SQLvSQL語言提供了兩種不同的使用方式:語言提供了兩種不同的使用方式:交互式交互式嵌入式嵌入式將將SQLSQL語句嵌入到其它宿主語言編寫的語句嵌入到其它宿主語言編寫的程序中,作為宿主語言的子語言,使宿主程序中,作為宿主語言的子語言,使宿主語言具備訪問數(shù)據(jù)庫的能力。語言具備訪問數(shù)據(jù)庫的能力。宿主語言宿主語言:COBOL, C, Pascal, COBOL, C, Pascal, Fortran, VC
2、+, VB, DEPHI, CBFortran, VC+, VB, DEPHI, CB等等能嵌入能嵌入SQLSQL語句的高級(jí)語言。語句的高級(jí)語言。宿主語言本身不能直接識(shí)別宿主語言本身不能直接識(shí)別SQLSQL語句。語句。 v為什么要引入嵌入式為什么要引入嵌入式SQLnSQL語言是非過程性語言語言是非過程性語言n事務(wù)處理應(yīng)用需要高級(jí)語言事務(wù)處理應(yīng)用需要高級(jí)語言v這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語句要做某些必要的擴(kuò)充。語句要做某些必要的擴(kuò)充。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程把把SQLSQL嵌入到其他高級(jí)語言中
3、,必須解決的三個(gè)問題:嵌入到其他高級(jí)語言中,必須解決的三個(gè)問題:語句識(shí)別語句識(shí)別如何區(qū)分如何區(qū)分SQLSQL語句和主語言語句。語句和主語言語句。n 數(shù)據(jù)交換數(shù)據(jù)交換由主語言提出的操作或數(shù)據(jù),如何讓數(shù)由主語言提出的操作或數(shù)據(jù),如何讓數(shù)據(jù)庫管理系統(tǒng)執(zhí)行,由數(shù)據(jù)庫查詢出的數(shù)據(jù)如何交由據(jù)庫管理系統(tǒng)執(zhí)行,由數(shù)據(jù)庫查詢出的數(shù)據(jù)如何交由主語言處理。主語言處理。n 協(xié)調(diào)主語言的單記錄操作和數(shù)據(jù)庫的集合操作。協(xié)調(diào)主語言的單記錄操作和數(shù)據(jù)庫的集合操作。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1.1 嵌入式嵌入式SQL的處理過程的處理過程對(duì)宿主型數(shù)據(jù)庫語言對(duì)宿主型數(shù)據(jù)庫語言SQL(ESQL
4、)SQL(ESQL),DBMSDBMS采用采用預(yù)編譯預(yù)編譯方法處理:方法處理: 1由由DBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識(shí)別出識(shí)別出SQL語句語句 2把它們把它們轉(zhuǎn)換轉(zhuǎn)換成主語言調(diào)用語句,以使主語言成主語言調(diào)用語句,以使主語言編譯程序能識(shí)別它編譯程序能識(shí)別它 3最后由主語言的編譯程序?qū)⒄麄€(gè)源程序最后由主語言的編譯程序?qū)⒄麄€(gè)源程序編譯編譯成目標(biāo)碼。成目標(biāo)碼。主語言程序含主語言程序含ESQLESQL語句語句ESQLESQL語句轉(zhuǎn)換語句轉(zhuǎn)換為函數(shù)調(diào)用為函數(shù)調(diào)用目標(biāo)語言程序目標(biāo)語言程序RDBMSRDBMS的的預(yù)處理程序預(yù)處理程序主語言主語言編譯程序編譯程序ESQLES
5、QL基本處理過程基本處理過程數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1.1 嵌入式嵌入式SQL的處理過程的處理過程為了能夠區(qū)分為了能夠區(qū)分SQLSQL語句與主語言語句,所有的語句與主語言語句,所有的SQLSQL語句語句必需要有前綴必需要有前綴EXEC SQL,以以( (;) )結(jié)束結(jié)束, ,嵌入式嵌入式SQLSQL語句的語句的一般形式一般形式 EXEC SQL SQLEXEC SQL ; ;例:例:EXEC SQL DROP TABLE StudentEXEC SQL DROP TABLE Student; ;數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫
6、編程8.1.2 嵌入式嵌入式SQL語句與主語言之間的通信語句與主語言之間的通信將將SQL嵌入到高級(jí)語言中混合編程,程序中會(huì)含有兩種不同計(jì)算嵌入到高級(jí)語言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語句。模型的語句。SQL語句語句 描述性的面向集合的語句描述性的面向集合的語句 負(fù)責(zé)操縱數(shù)據(jù)庫負(fù)責(zé)操縱數(shù)據(jù)庫高級(jí)語言語句高級(jí)語言語句 過程性的面向記錄的語句過程性的面向記錄的語句 負(fù)責(zé)控制程序流程負(fù)責(zé)控制程序流程嵌入式嵌入式SQLSQL語句與主語言之間的語句與主語言之間的通信通信主要是指:描述性面向集主要是指:描述性面向集合與過程性面向紀(jì)錄(元組)語句之間的通信。合與過程性面向紀(jì)錄(元組)語句之間的通信
7、。 數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程工作單元之間的通信方式工作單元之間的通信方式vSQL通信區(qū)通信區(qū) 向主語言傳遞向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息,主語言能夠據(jù)此控制語句的執(zhí)行狀態(tài)信息,主語言能夠據(jù)此控制程序流程。程序流程。v主變量主變量 1)主語言向)主語言向SQL語句提供參數(shù)。語句提供參數(shù)。 2)將)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進(jìn)一步處理。語句查詢數(shù)據(jù)庫的結(jié)果交主語言進(jìn)一步處理。v 游標(biāo)游標(biāo)解決集合性操作語言與過程性操作語言的不匹配。解決集合性操作語言與過程性操作語言的不匹配。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程一、一、
8、SQL通信區(qū)通信區(qū)SQLCASQLCA: SQL Communication AreaSQL Communication Area是一個(gè)數(shù)據(jù)結(jié)構(gòu)是一個(gè)數(shù)據(jù)結(jié)構(gòu)存放狀態(tài)信息供程序讀取存放狀態(tài)信息供程序讀取 。SQLCASQLCA的用途的用途SQLSQL語句執(zhí)行后,語句執(zhí)行后,DBMSDBMS反饋給應(yīng)用程序信息反饋給應(yīng)用程序信息 描述系統(tǒng)當(dāng)前工作狀態(tài)描述系統(tǒng)當(dāng)前工作狀態(tài) 描述運(yùn)行環(huán)境描述運(yùn)行環(huán)境這些信息將送到這些信息將送到SQLSQL通信區(qū)通信區(qū)SQLCASQLCA中,應(yīng)用程序從中,應(yīng)用程序從SQLCASQLCA中取出這些狀態(tài)信息,據(jù)中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句此決定接下來執(zhí)行的語
9、句定義定義SQLCASQLCA 用用EXEC SQL INCLUDE SQLCAEXEC SQL INCLUDE SQLCA加以定義加以定義使用使用SQLCASQLCASQLCASQLCA中有一個(gè)存放每次執(zhí)行中有一個(gè)存放每次執(zhí)行SQLSQL語句后返回代碼的變量語句后返回代碼的變量SQLCODESQLCODE ;如果如果SQLCODESQLCODE等于預(yù)定義的常量等于預(yù)定義的常量SUCCESSSUCCESS,則表示,則表示SQLSQL語句成功,否則在語句成功,否則在SQLCODE SQLCODE 存放錯(cuò)誤代碼;存放錯(cuò)誤代碼;應(yīng)用程序每執(zhí)行完一條應(yīng)用程序每執(zhí)行完一條SQL SQL 語句之后都應(yīng)該測(cè)
10、試一下語句之后都應(yīng)該測(cè)試一下SQLCODESQLCODE的值,以了解該的值,以了解該SQLSQL語句執(zhí)行情況并做相應(yīng)處理。語句執(zhí)行情況并做相應(yīng)處理。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程二、二、 主變量主變量 v什么是主變量什么是主變量嵌入式嵌入式SQLSQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù),在語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù),在SQLSQL語語句中使用的主語言程序變量簡(jiǎn)稱為主變量(句中使用的主語言程序變量簡(jiǎn)稱為主變量(Host VariableHost Variable)v主變量的類型主變量的類型輸入主變量輸入主變量-由應(yīng)用程序?qū)ζ滟x值,由
11、應(yīng)用程序?qū)ζ滟x值,SQLSQL語句引用。語句引用。輸出主變量輸出主變量-由由SQLSQL語句賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序。語句賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序。一個(gè)主變量有可能既是輸入主變量又是輸出主變量一個(gè)主變量有可能既是輸入主變量又是輸出主變量v定義定義SQLCASQLCA 用用EXEC SQL INCLUDE SQLCAEXEC SQL INCLUDE SQLCA加以定義加以定義v使用使用SQLCASQLCASQLCASQLCA中有一個(gè)存放每次執(zhí)行中有一個(gè)存放每次執(zhí)行SQLSQL語句后返回代碼的變量語句后返回代碼的變量SQLCODE SQLCODE ;如果如果SQLCODESQL
12、CODE等于預(yù)定義的常量等于預(yù)定義的常量SUCCESSSUCCESS,則表示,則表示SQLSQL語句成功,否則在語句成功,否則在SQLCODESQLCODE 存放錯(cuò)誤代碼;存放錯(cuò)誤代碼;應(yīng)用程序每執(zhí)行完一條應(yīng)用程序每執(zhí)行完一條SQL SQL 語句之后都應(yīng)該測(cè)試一下語句之后都應(yīng)該測(cè)試一下SQLCODESQLCODE的值,以了解的值,以了解該該SQLSQL語句執(zhí)行情況并做相應(yīng)處理。語句執(zhí)行情況并做相應(yīng)處理。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程v指示變量指示變量一個(gè)主變量可以附帶一個(gè)指示變量(一個(gè)主變量可以附帶一個(gè)指示變量(Indicator Variable)什么是指示變
13、量什么是指示變量 整型變量整型變量 用來用來“指示指示”所指主變量的值或條件。所指主變量的值或條件。指示變量的用途指示變量的用途 指示變量可以輸入主變量是否為空值指示變量可以輸入主變量是否為空值 指示變量可以檢測(cè)輸出主變量是否為空值,值是否被截?cái)唷V甘咀兞靠梢詸z測(cè)輸出主變量是否為空值,值是否被截?cái)?。?shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程v在在SQL語句中使用主變量和指示變量的方法語句中使用主變量和指示變量的方法1) 說明主變量和指示變量說明主變量和指示變量BEGIN DECLARE SECTION. . (說明主變量和指示變量說明主變量和指示變量)END DECLARE
14、 SECTION2) 使用主變量使用主變量 說明之后的主變量可以在說明之后的主變量可以在SQL語句中任何一個(gè)能夠使用表達(dá)式的語句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn)。地方出現(xiàn)。 為了與數(shù)據(jù)庫對(duì)象名(表名、視圖名、列名等)區(qū)別,為了與數(shù)據(jù)庫對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語句語句中的主變量名前要加冒號(hào)(中的主變量名前要加冒號(hào)(:)作為標(biāo)志)作為標(biāo)志3) 使用指示變量使用指示變量 指示變量前也必須加冒號(hào)標(biāo)志指示變量前也必須加冒號(hào)標(biāo)志 必須緊跟在所指主變量之后必須緊跟在所指主變量之后v在在SQL語句之外語句之外(主語言語句中主語言語句中)使用主變量和指示變量的方法:使用主變量和指示變量的方法
15、:可以直接引用,不必加冒號(hào)??梢灾苯右?,不必加冒號(hào)。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程三、游標(biāo)(三、游標(biāo)(cursor)1、為什么要使用游標(biāo)、為什么要使用游標(biāo)SQL語言與主語言具有不同數(shù)據(jù)處理方式語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記語句原則上可以產(chǎn)生或處理多條記錄錄主語言是面向記錄的,一組主變量一次只能存放一條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄 僅使用主變量并不能完全滿足僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求語句向應(yīng)用程序輸出數(shù)據(jù)的要求 嵌入
16、式嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式2、什么是游標(biāo)、什么是游標(biāo)游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果語句的執(zhí)行結(jié)果每個(gè)游標(biāo)區(qū)都有一個(gè)名字每個(gè)游標(biāo)區(qū)都有一個(gè)名字用戶可以用用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理。語言進(jìn)一步處理。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程四、四、 建立和關(guān)閉數(shù)據(jù)庫連接建立和關(guān)閉數(shù)據(jù)庫連接1、建立數(shù)據(jù)庫連接、建立數(shù)據(jù)庫連接嵌入式嵌入
17、式SQL要訪問數(shù)據(jù)庫必須先連接數(shù)據(jù)庫,要訪問數(shù)據(jù)庫必須先連接數(shù)據(jù)庫,DBMS根據(jù)用戶信息根據(jù)用戶信息對(duì)連接請(qǐng)求進(jìn)行合法性驗(yàn)證,只有通過了身份驗(yàn)證,才能建立一個(gè)可用對(duì)連接請(qǐng)求進(jìn)行合法性驗(yàn)證,只有通過了身份驗(yàn)證,才能建立一個(gè)可用的合法連接。其語句是:的合法連接。其語句是:EXEC SQL CONNECT TO targetAS connection-nameUSER user-name;Target:是連接數(shù)據(jù)庫的數(shù)據(jù)庫服務(wù)器,它可以是一個(gè)常見的服務(wù)器,是連接數(shù)據(jù)庫的數(shù)據(jù)庫服務(wù)器,它可以是一個(gè)常見的服務(wù)器,或是包含服務(wù)器標(biāo)識(shí)的或是包含服務(wù)器標(biāo)識(shí)的SQL串常量,也可以是串常量,也可以是DEFAULT
18、。connection-name:是可選擇的連接名,連接必須是一個(gè)有效標(biāo)識(shí)符,:是可選擇的連接名,連接必須是一個(gè)有效標(biāo)識(shí)符,主要用來標(biāo)識(shí)整個(gè)程序內(nèi)同時(shí)建立多個(gè)連接,如果整個(gè)程序中只有一個(gè)主要用來標(biāo)識(shí)整個(gè)程序內(nèi)同時(shí)建立多個(gè)連接,如果整個(gè)程序中只有一個(gè)連接也可以不指定連接名。如果程序運(yùn)行過程中建立了多個(gè)連接,執(zhí)行連接也可以不指定連接名。如果程序運(yùn)行過程中建立了多個(gè)連接,執(zhí)行所有的數(shù)據(jù)庫單元的工作都在該操作提交時(shí)所選擇的當(dāng)前連接上。程序所有的數(shù)據(jù)庫單元的工作都在該操作提交時(shí)所選擇的當(dāng)前連接上。程序運(yùn)行過程中可以修改當(dāng)前連接,對(duì)應(yīng)的嵌入式運(yùn)行過程中可以修改當(dāng)前連接,對(duì)應(yīng)的嵌入式SQL語句是:語句是:E
19、XEC SQL SET CONNECT TO connection-name| DEFAULT數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程2、關(guān)閉數(shù)據(jù)庫連接、關(guān)閉數(shù)據(jù)庫連接當(dāng)某個(gè)連接上的所有數(shù)據(jù)庫操作完成后,應(yīng)用程序應(yīng)該主動(dòng)釋放所占當(dāng)某個(gè)連接上的所有數(shù)據(jù)庫操作完成后,應(yīng)用程序應(yīng)該主動(dòng)釋放所占用的連接資源。用的連接資源。EXEC SQL DISCONNECT connection;connection:是:是EXEC SQL CONNECT所建立的數(shù)據(jù)庫連接所建立的數(shù)據(jù)庫連接數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程五、五、 程序?qū)嵗绦驅(qū)嵗?:依次檢查
20、某個(gè)系學(xué)生的記錄,交互式更新某些學(xué)生的年齡。:依次檢查某個(gè)系學(xué)生的記錄,交互式更新某些學(xué)生的年齡。EXEC SQL BEGIN DECLARE SECTION; /* 說明主變量說明主變量 */ CHAR deptname(20); CHAR HSno(9); CHAR HSname(20); CHAR HSeex(2); INT HSage; INT NEWAGE;EXEC SQL END DECLARE SECTION;Long SQLCODE;EXEC SQL INCLUDE SQLCA; /* 定義定義SQL通信區(qū)通信區(qū) */數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編
21、程main(void) int count=0; char yn; printf(“Please choose the department name(CS/MA/IS):”); scanf(“%s”,& deptname); EXEC SQL CONNECT TO TESTlocalhost:54321 USER”SYSTEM”/”MANAGER”; EXEC SQL DECLARE SX CURSOR FOR /* 定義游標(biāo)定義游標(biāo)SX*/ SELECT Sno,Sname,Seex,Sage /* SX對(duì)應(yīng)的語句對(duì)應(yīng)的語句*/ FROM Student WHERE Sdept=: dep
22、tname; EXEC SQL OPEN SX; /* 打開游標(biāo)打開游標(biāo)SX,指向查詢結(jié)果的第一行,指向查詢結(jié)果的第一行*/數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程 for(;) EXEC SQL FETCH SX INTO : Hsno,:Hsname,:Hseex,:HSage; /* 將當(dāng)前數(shù)據(jù)放入主變量并推進(jìn)游標(biāo)指針將當(dāng)前數(shù)據(jù)放入主變量并推進(jìn)游標(biāo)指針*/ if (sqlca.sqlcode SUCCESS) /* 利用利用SQLCA中的狀態(tài)信息決定何時(shí)退出循環(huán)中的狀態(tài)信息決定何時(shí)退出循環(huán) */ break; if(count +=0) printf(“ n%-10
23、s %-20s %-10s, %10sn”, “Sno ”, “Sname ”, “Ssex ”, “Sage ”); /* 如果是第一行如果是第一行,則打印行頭則打印行頭 */ printf( %-10s %-20s %-10s, %-10d , Sno, Sname, Ssex, Sage); /* 顯示該記錄顯示該記錄 */ printf(UPDATE AGE (y/n)? ); /* 問用戶是否要修改問用戶是否要修改 */數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程 Do scanf(%c,&yn); While(yn!=n & yn!=N &yn!=y & yn!=
24、Y ); if (yn=y | yn=Y) /* 需要修改需要修改 */ printf(INPUT NEW AGE: ); scanf(%d,&NEWAge); /* 輸入新的年齡值輸入新的年齡值 */ EXEC SQL UPDATE Student SET Sage=:NEWAge WHERE CURRENT OF SX; /* 修改當(dāng)前記錄的年齡字段修改當(dāng)前記錄的年齡字段 */ EXEC SQL CLOSE SX; /* 關(guān)閉游標(biāo)關(guān)閉游標(biāo)*/ EXEC SQL COMMIT WORK/* 提交更新提交更新*/ EXEC SQL DISCONNECT TEST /* 斷開數(shù)據(jù)庫連接斷開數(shù)據(jù)庫
25、連接*/數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1.3 不用游標(biāo)的不用游標(biāo)的SQL語句語句不用游標(biāo)的不用游標(biāo)的SQL語句的種類語句的種類 說明性語句說明性語句 數(shù)據(jù)定義語句數(shù)據(jù)定義語句 數(shù)據(jù)控制語句數(shù)據(jù)控制語句 查詢結(jié)果為單記錄的查詢結(jié)果為單記錄的SELECT語句語句 非非CURRENT形式的形式的UPDATE語句語句 非非CURRENT形式的形式的DELETE語句語句 INSERT語句語句數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程一、說明性語句一、說明性語句說明性語句是專為在嵌入式說明性語句是專為在嵌入式SQL中說明主變量、中說明主變量、SQLC
26、A等而設(shè)置的。等而設(shè)置的。v說明主變量說明主變量1. EXEC SQL BEGIN DECLARE SECTION; 2. EXEC SQL END DECLARE SECTION;這兩條語句必須配對(duì)出現(xiàn),相當(dāng)于一個(gè)括號(hào),兩條語句中間是主這兩條語句必須配對(duì)出現(xiàn),相當(dāng)于一個(gè)括號(hào),兩條語句中間是主變量的說明變量的說明v說明說明SQLCA3. EXEC SQL INCLUDE SQLCA數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程二、數(shù)據(jù)定義語句二、數(shù)據(jù)定義語句例例2 建立一個(gè)建立一個(gè)“學(xué)生學(xué)生”表表Student EXEC SQL CREATE TABLE Student (Sn
27、o CHAR(5) NOT NULL UNIQUE, Sname CHAR(20), Ssex CHAR(1), Sage INT, Sdept CHAR(15);注:注:數(shù)據(jù)定義語句中不允許使用主變量數(shù)據(jù)定義語句中不允許使用主變量例:下列語句是錯(cuò)誤的例:下列語句是錯(cuò)誤的 EXEC SQL DROP TABLE :table_name;三、數(shù)據(jù)控制語句三、數(shù)據(jù)控制語句例例3 把查詢把查詢Student表權(quán)限授給用戶表權(quán)限授給用戶U1 EXEC SQL GRANT SELECT ON TABLE Student TO U1;數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程四、查詢結(jié)
28、果為單記錄的四、查詢結(jié)果為單記錄的SELECT語句語句 語句格式語句格式EXEC SQL SELECT ALL|DISTINCT ,. INTO ,. FROM , . WHERE GROUP BY HAVING ORDER BY ASC|DESC;對(duì)交互式對(duì)交互式SELECT語句的擴(kuò)充就是多了一個(gè)語句的擴(kuò)充就是多了一個(gè)INTO子句。子句。把從數(shù)據(jù)庫中找到的符合條件的記錄,放到把從數(shù)據(jù)庫中找到的符合條件的記錄,放到INTO子句指出的子句指出的主變量中去。主變量中去。 使用注意事項(xiàng)使用注意事項(xiàng) 1. 使用主變量使用主變量 INTO子句子句 WHERE子句的條件表達(dá)式子句的條件表達(dá)式 HAVING
29、短語的條件表達(dá)式短語的條件表達(dá)式數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程2. 使用指示變量使用指示變量指示變量只能用于指示變量只能用于INTO子句中子句中如果如果INTO子句中主變量后面跟有指示變量,則當(dāng)查詢得出的某個(gè)子句中主變量后面跟有指示變量,則當(dāng)查詢得出的某個(gè)數(shù)據(jù)項(xiàng)為空值時(shí),系統(tǒng)會(huì)自動(dòng)將相應(yīng)主變量后面的指示變量置為負(fù)數(shù)據(jù)項(xiàng)為空值時(shí),系統(tǒng)會(huì)自動(dòng)將相應(yīng)主變量后面的指示變量置為負(fù)值,但不向該主變量執(zhí)行賦值操作,即主變量值仍保持執(zhí)行值,但不向該主變量執(zhí)行賦值操作,即主變量值仍保持執(zhí)行SQL語語句之前的值句之前的值當(dāng)發(fā)現(xiàn)指示變量值為負(fù)值時(shí),不管主變量為何值,均應(yīng)認(rèn)為主變量當(dāng)發(fā)
30、現(xiàn)指示變量值為負(fù)值時(shí),不管主變量為何值,均應(yīng)認(rèn)為主變量值為值為NULL3. 查詢結(jié)果為空集查詢結(jié)果為空集如果數(shù)據(jù)庫中沒有滿足條件的記錄,即查詢結(jié)果為空,則如果數(shù)據(jù)庫中沒有滿足條件的記錄,即查詢結(jié)果為空,則DBMS將將SQLCODE的值置為的值置為1004. 查詢結(jié)果為多條記錄查詢結(jié)果為多條記錄程序出錯(cuò),程序出錯(cuò),DBMS會(huì)在會(huì)在SQLCA中返回錯(cuò)誤信息中返回錯(cuò)誤信息數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程例例4 根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。 假設(shè)已將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量假設(shè)已將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensnoEXEC SQL
31、 SELECT Sno, Sname, Ssex, Sage, Sdept INTO :Hsno, :Hname, :Hsex, :Hage, :Hdept FROM Student WHERE Sno=:givensno;Hsno, Hname, Hsex, Hage, Hdept和和givensno均是主變量,并均已在前均是主變量,并均已在前面的程序中說明過了。面的程序中說明過了。例例5 查詢某個(gè)學(xué)生選修某門課程的成績(jī)。查詢某個(gè)學(xué)生選修某門課程的成績(jī)。 假設(shè)已將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量假設(shè)已將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno,將課程號(hào)賦給了,將課程號(hào)賦給了主變量主變量g
32、ivencno。 EXEC SQL SELECT Sno, Cno, Grade INTO :Hsno, :Hcno, :Hgrade:Gradeid FROM SC WHERE Sno=:givensno AND Cno=:givencno;數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程從提高應(yīng)用程序的數(shù)據(jù)獨(dú)立性角度考慮,從提高應(yīng)用程序的數(shù)據(jù)獨(dú)立性角度考慮,SELECT語句在任語句在任何情況下都應(yīng)該使用游標(biāo)何情況下都應(yīng)該使用游標(biāo)對(duì)于僅返回一行結(jié)果數(shù)據(jù)的對(duì)于僅返回一行結(jié)果數(shù)據(jù)的SELECT語句雖然可以不使用游標(biāo)語句雖然可以不使用游標(biāo)但如果以后數(shù)據(jù)庫改變了,該但如果以后數(shù)據(jù)庫改變
33、了,該SELECT語句可能會(huì)返回多行數(shù)據(jù),這語句可能會(huì)返回多行數(shù)據(jù),這時(shí)該語句就會(huì)出錯(cuò)時(shí)該語句就會(huì)出錯(cuò)數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程五、非五、非CURRENT形式的增刪改語句形式的增刪改語句v非非CURRENT形式的形式的UPDATE語句語句使用主變量使用主變量 SET子句子句 WHERE子句子句使用指示變量使用指示變量 SET子句子句v非非CURRENT形式的形式的UPDATE語句可以操作多條元組語句可以操作多條元組例例6 修改某個(gè)學(xué)生修改某個(gè)學(xué)生1號(hào)課程的成績(jī)。號(hào)課程的成績(jī)。 假設(shè)該學(xué)生的學(xué)號(hào)已賦給主變量假設(shè)該學(xué)生的學(xué)號(hào)已賦給主變量givensno,修改后的
34、成績(jī)已賦給主,修改后的成績(jī)已賦給主變量變量newgrade。 EXEC SQL UPDATE SC SET Grade=:newgrade WHERE Sno=:givensno and Cno=1;數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程例例7 將計(jì)算機(jī)系全體學(xué)生年齡置將計(jì)算機(jī)系全體學(xué)生年齡置NULL值值 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise:Sageid WHERE Sdept=CS;將指示變量將指示變量Sageid賦一個(gè)負(fù)值后,無論主變量賦一個(gè)負(fù)值后,無論主變量Raise為何值,為何值,DBMS都都會(huì)將
35、會(huì)將CS系所有記錄的年齡屬性置空值。它等價(jià)于:系所有記錄的年齡屬性置空值。它等價(jià)于: EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdept=CS;數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程例例8 某個(gè)學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。某個(gè)學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。 假設(shè)該學(xué)生的姓名已賦給主變量假設(shè)該學(xué)生的姓名已賦給主變量stdname EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdname);
36、例例9 某個(gè)學(xué)生新選修了某門課程,將有關(guān)記錄插入某個(gè)學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表表 假設(shè)學(xué)生的學(xué)號(hào)已賦給主變量假設(shè)學(xué)生的學(xué)號(hào)已賦給主變量stdno,課程號(hào)已賦給主變量,課程號(hào)已賦給主變量couno。 gradeid=-1; EXEC SQL INSERT INTO SC(Sno, Cno, Grade) VALUES(:stdno, :couno, :gr:gradeid);由于該學(xué)生剛選修課程,尚未考試,因此成績(jī)列為空。所以本例中用由于該學(xué)生剛選修課程,尚未考試,因此成績(jī)列為空。所以本例中用指示變量指示相應(yīng)的主變量為空值。指示變量指示相應(yīng)的主變量為空值。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)
37、概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程8.1.4 8.1.4 使用游標(biāo)的使用游標(biāo)的SQLSQL語句語句必須使用游標(biāo)的必須使用游標(biāo)的SQL語句語句查詢結(jié)果為多條記錄的查詢結(jié)果為多條記錄的SELECT語句語句CURRENT形式的形式的UPDATE語句語句CURRENT形式的形式的DELETE語句語句一、一、 查詢結(jié)果為多條記錄的查詢結(jié)果為多條記錄的SELECT語句語句使用游標(biāo)的步驟:使用游標(biāo)的步驟:1. 說明游標(biāo)說明游標(biāo)2. 打開游標(biāo)打開游標(biāo)3. 移動(dòng)游標(biāo)指針,然后取當(dāng)前記錄移動(dòng)游標(biāo)指針,然后取當(dāng)前記錄4. 關(guān)閉游標(biāo)關(guān)閉游標(biāo)數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程1. 說明游
38、標(biāo)說明游標(biāo)語句格式語句格式EXEC SQL DECLARE CURSOR FOR ;功能:功能:是一條說明性語句,這時(shí)是一條說明性語句,這時(shí)DBMS并不執(zhí)行并不執(zhí)行SELECT指定的查詢操作。指定的查詢操作。2. 打開游標(biāo)打開游標(biāo)語句格式語句格式 EXEC SQL OPEN ;功能:功能:打開游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的打開游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語句,把所有滿足查詢語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中,這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指條件的記錄從指定表取到緩沖區(qū)中,這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中第一條記錄之前。向查詢結(jié)果集中第一條記錄之前。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概
39、論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程3. 移動(dòng)游標(biāo)指針,然后取當(dāng)前記錄移動(dòng)游標(biāo)指針,然后取當(dāng)前記錄語句格式語句格式EXEC SQL FETCH NEXT|PRIOR|FIRST|LAST FROM INTO ,.;功能功能:指定方向推動(dòng)游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來:指定方向推動(dòng)游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理。送至主變量供主語言進(jìn)一步處理。NEXT|PRIOR|FIRST|LAST:指定推動(dòng)游標(biāo)指針的方式。:指定推動(dòng)游標(biāo)指針的方式。NEXT:向前推進(jìn)一條記錄(缺省值):向前推進(jìn)一條記錄(缺省值)PRIOR:向回退一條記錄:向回退一條記錄FIRST
40、:推向第一條記錄:推向第一條記錄LAST:推向最后一條記錄:推向最后一條記錄說明說明(1) 主變量必須與主變量必須與SELECT語句中的目標(biāo)列表達(dá)式具有一一對(duì)應(yīng)語句中的目標(biāo)列表達(dá)式具有一一對(duì)應(yīng)關(guān)系關(guān)系(2) FETCH語句通常用在一個(gè)循環(huán)結(jié)構(gòu)中,通過循環(huán)執(zhí)行語句通常用在一個(gè)循環(huán)結(jié)構(gòu)中,通過循環(huán)執(zhí)行FETCH語句逐條取出結(jié)果集中的行進(jìn)行處理語句逐條取出結(jié)果集中的行進(jìn)行處理(3) 為進(jìn)一步方便用戶處理數(shù)據(jù),現(xiàn)在一些關(guān)系數(shù)據(jù)庫管理系統(tǒng)為進(jìn)一步方便用戶處理數(shù)據(jù),現(xiàn)在一些關(guān)系數(shù)據(jù)庫管理系統(tǒng)對(duì)對(duì)FETCH語句做了擴(kuò)充,允許用戶向任意方向以任意步長(zhǎng)移語句做了擴(kuò)充,允許用戶向任意方向以任意步長(zhǎng)移動(dòng)游標(biāo)指針。動(dòng)
41、游標(biāo)指針。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程4. 關(guān)閉游標(biāo)關(guān)閉游標(biāo)語句格式語句格式 EXEC SQL CLOSE ;功能功能關(guān)閉游標(biāo),釋放結(jié)果及占用的緩沖區(qū)及其他資源。關(guān)閉游標(biāo),釋放結(jié)果及占用的緩沖區(qū)及其他資源。說明說明游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標(biāo)可游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系。以再次被打開,與新的查詢結(jié)果相聯(lián)系。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程二、二、CURRENT形式的形式的UPDATE語句和語句和DELETE語句語句CURRENT形式的形式
42、的UPDATE語句和語句和DELETE語句的用途語句的用途.CURRENT形式的形式的UPDATE語句和語句和DELETE語句語句 面向集合的操作面向集合的操作; 一次修改或刪除所有滿足條件的記錄一次修改或刪除所有滿足條件的記錄.如果只想修改或刪除其中某個(gè)記錄;如果只想修改或刪除其中某個(gè)記錄; 用帶游標(biāo)的用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄;語句查出所有滿足條件的記錄; 從中進(jìn)一步找出要修改或刪除的記錄;從中進(jìn)一步找出要修改或刪除的記錄; 用用CURRENT形式的形式的UPDATE語句和語句和DELETE語句修改或刪除語句修改或刪除之。之。數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章
43、數(shù)據(jù)庫編程數(shù)據(jù)庫編程步驟步驟(1) DECLARE 說明游標(biāo)說明游標(biāo) (2) OPEN 打開游標(biāo),把所有滿足查詢條件的記錄從指定表取至緩沖區(qū)打開游標(biāo),把所有滿足查詢條件的記錄從指定表取至緩沖區(qū)(3) FETCH推進(jìn)游標(biāo)指針,并把當(dāng)前記錄從緩沖區(qū)中取出來送至主變量推進(jìn)游標(biāo)指針,并把當(dāng)前記錄從緩沖區(qū)中取出來送至主變量(4) 檢查該記錄是否是要修改或刪除的記錄,是則處理之檢查該記錄是否是要修改或刪除的記錄,是則處理之 (5) 重復(fù)第重復(fù)第(3)和和(4)步,用逐條取出結(jié)果集中的行進(jìn)行判斷和處理步,用逐條取出結(jié)果集中的行進(jìn)行判斷和處理(6) CLOSE 關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)和其他資源關(guān)閉游
44、標(biāo),釋放結(jié)果集占用的緩沖區(qū)和其他資源數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程說明游標(biāo)說明游標(biāo)v為為UPDATE語句說明游標(biāo)語句說明游標(biāo)語句格式語句格式 EXEC SQL DECLARE CURSOR FOR FOR UPDATE OF ;說明:說明:FOR UPDATE OF 短語用于指明檢索出的數(shù)據(jù)在指定列短語用于指明檢索出的數(shù)據(jù)在指定列上是可修改的,以便上是可修改的,以便DBMS進(jìn)行并發(fā)控制進(jìn)行并發(fā)控制v為為DELETE語句說明游標(biāo)語句說明游標(biāo)語句格式語句格式 EXEC SQL DECLARE CURSOR FOR FOR UPDATE;說明:說明:FOR UPDAT
45、E短語提示短語提示DBMS進(jìn)行并發(fā)控制進(jìn)行并發(fā)控制數(shù)據(jù)庫系統(tǒng)概論數(shù)據(jù)庫系統(tǒng)概論第八章第八章 數(shù)據(jù)庫編程數(shù)據(jù)庫編程v修改或刪除當(dāng)前記錄修改或刪除當(dāng)前記錄經(jīng)檢查緩沖區(qū)中記錄是要修改或刪除的記錄,則用經(jīng)檢查緩沖區(qū)中記錄是要修改或刪除的記錄,則用UPDATE語語句或句或DELETE語句修改或刪除該記錄語句修改或刪除該記錄語句格式語句格式 WHERE CURRENT OF WHERE CURRENT OF WHERE CURRENT OF 子句表示修改或刪除的是該游子句表示修改或刪除的是該游標(biāo)中最近一次取出的記錄標(biāo)中最近一次取出的記錄v當(dāng)游標(biāo)定義中的當(dāng)游標(biāo)定義中的SELECT語句帶有語句帶有UNION或或ORDER BY子句時(shí),子句時(shí),或者該或者該SELECT語句相當(dāng)于定義了一個(gè)不可更新的視圖時(shí),不能語句相當(dāng)于定義了一個(gè)不可更新的視圖時(shí),不能使用使用CURRENT形式的形式的UPDATE語句和語句和DELETE語句語句數(shù)據(jù)庫系統(tǒng)概
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園后廚股制合同模板
- 商鋪?zhàn)赓U招標(biāo)合同范例
- 大米采購違約合同范例
- 制香廠合同范例
- 河北省唐山市金太陽聯(lián)考2024-2025學(xué)年高一上學(xué)期11月期中物理試卷
- 山東省濟(jì)南市鋼城區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期11月期中數(shù)學(xué)試題
- 學(xué)校裝修施工合同模板
- 方解石購銷合同范例
- 雙方自愿合同模板
- 微信 托管 合同范例
- 安全隱患規(guī)范依據(jù)查詢手冊(cè)22大類12萬字
- 外科病例分析
- 一年級(jí)10以內(nèi)口算100道題(共20套)-直接打印版
- mtl營(yíng)銷管理流程
- 小學(xué)教學(xué)整改方案及措施
- 中華民族共同體概論課件專家版6第六講 五胡入華與中華民族大交融(魏晉南北朝)
- 《歐洲民間故事》測(cè)試題
- 《狼和鴨子》PPT課件小學(xué)幼兒園兒童故事表演幻燈片背景有音樂
- 儲(chǔ)能電站安全教育培訓(xùn)
- 課程教學(xué)與課程思政內(nèi)容融合
- 2024中小企業(yè)ESG信息披露指南
評(píng)論
0/150
提交評(píng)論