睡裡醒起的一個夢,逼我出走
筆記
2021年9月11日 星期六
2021年8月9日 星期一
2021年8月2日 星期一
2021年7月28日 星期三
透過 ojdbc6 連 oracle,並進行基本操作
建立一個 maven 的專案,設定 pom.xml 的 dependency,利用 maven 下載 ojdbc6 的函式庫,並透過 ojdbc6 連入 oracle 完成 INSERT/UPDATE/SELECT/DELETE 基本操作
2021年6月10日 星期四
2021年6月3日 星期四
在 OracleLinux 上安裝 oracle database (19c)
oracle 是透過 oracle-database-preinstall 和 oracle-database-ee 的
rpm 安裝,所以會少掉很多設定的地方,像是環境變數,新建 linux 的 group 和
user 之類的部份。
環境:
y04 是 linux 使用者的 id
在 VMWare 下新安裝的 OracleLinux (OracleLinux-R8-U4-x86_64-dvd_iso)
已安裝 JAVA JDK
用到的檔案,下載到 \home\y04\Downloads,這個位置
compat-libcap1-1.10-7.el7.x86_64.rpm
http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm
compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm
http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libcap1-1.10-7.el7.x86_64.rpm
oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
oracle-database-ee-19c-1.0-1.x86_64.rpm
oracle 官網自行下載
過程(安裝 database)
透過內建的 firefox 把下列檔案抓回來
oracle database 要用到的套件
http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm
http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libcap1-1.10-7.el7.x86_64.rpm
oracle preinstall 會幫忙處理一些新增 group 和 user 的動作
https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
oracle database 本體,直接到 oracle 官網自行下載
oracle-database-ee-19c-1.0-1.x86_64.rpm
以下所有操作均在 terminal 下執行
關防火牆
systemctl stop firewalld.service
關防火牆的自動啟動
systemctl disable firewalld.service
檢查關閉狀態
systemctl status firewalld.service
dead 表示未啟動開啟啟動、inactive 表示現在是關閉
安裝相依套件
sudo yum install libstdc++-devel ksh glibc-devel libaio-devel
sudo yum localinstall /home/y04/Downloads/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm
sudo yum localinstall /home/y04/Downloads/compat-libcap1-1.10-7.el7.x86_64.rpm
安裝 oracle database preinstall
sudo yum localinstall /home/y04/Downloads/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
配置 oracle 帳號的環境變量 (preinstall 會在 linux 新增一個名字叫 oracle 的帳戶)
su - root //切換到 root 帳號
passwd oracle //重設 oracle 密碼為 123
su - oracle //切換到 oracle 帳號
vi ~/.bash_profile //用 vim 開 .bash_profile
確認下面設定有在 .bash_profile
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=ORCLCDB
#防止安裝過程出現亂碼
export LANG=en_US.UTF-8
#設定Oracle使用者端字元集,必須與Oracle安裝時設定的字元集保持一致,
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
su - root //切換到 root 帳號
安裝 oracle database
sudo yum localinstall /home/y04/Downloads/oracle-database-ee-19c-1.0-1.x86_64.rpm
配置腳本 (簡單檢查一下腳本內容,可以略過)
su – root
cd /etc/init.d/
vi oracledb_ORCLCDB-19c
執行腳本前置 (執行腳本之前的動作,主要是應對一些執行腳本過程中可能發生的問題)
對應「java.library.path 系統變數遺漏或無效」
(The java.library.path system variable is missing or invalid. Please set java.library.path with a correct value and retry the operation.)
yum install libnsl
對應「檔案 "/etc/oratab" 無法存取.」
(File "etc/oratab" is not accessible)
這個異常好像不會中斷腳本的執行
解法參考(https://www.cnblogs.com/datalife/archive/2011/03/15/1985253.html)
原因是安裝 oracle database 的時候,少 執行一個 root.sh
cd /opt/oracle/product/19c/dbhome_1/
./root.sh
執行腳本
su – root
cd /etc/init.d/
./oracledb_ORCLCDB-19c configure
重開機
過程(建立 database 到 client 可連入)
改 listener.ora 為允許 client 連入
修改 listener.ora 的內容,將原本的
listener.ora 的位置應該在 \opt\oracle\product\19c\dbhome_1\network\admin
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
改成
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
然後啟動或重啟 listener
lsnrctl status //oracle database listener 查詢狀態
> lsnrctl start //oracle database listener 啟動
lsnrctl stop //oracle database listener 停止
> lsnrctl reload //oracle database listener 重啟
啟動及設定 oracle
su - oracle
sqlplus / as sysdba
--啟動 database
--未啟動的錯誤 ORA-01034: ORACLE not available
SQL>startup;
SQL>alter database open;
SQL>exit;
--修改 datbase 的 sys 和 system 這兩個使用者的密碼,都改成 abc
SQL>alter user system identified by "abc";
SQL>alter user sys identified by "abc";
--查當前 sid
SQL>select instance from v$thread; --return ORCLCDB
or
SQL>select * from v$version;
SQL>select sys_context('userenv','instance_name') from dual; --return ORCLCDB
到這步應該外部就可以連入
測試用的軟體 (DBeaver)
host: 192.168.1.113 //看你自己的 linux ip
port: 1521 //oracle default
database (=sid=service): ORCLCDB //前面步驟查的
username: system //內建的
password: abc //前面設的
到這邊如果都順利的話就可以連入 oracle database 中了,接下來就是建立自己要用的測試資料庫
su - oracle
sqlplus / as sysdba
-- 確認 database 啟動了
SQL>startup;
SQL>alter database open; --or SQL>alter pluggable database all open;
SQL>select * from v$version; --先查當前版本,讓 dual 有東西
SQL>select sys_context ('USERENV', 'CON_NAME') from dual; --知道當前容器在 CDB$ROOT
SQL>select pdb from v$services; --查有那些 pdb,應廳會有一個 ORCLPDB1
or
SQL>show pdbs;
SQL>alter session set container=ORCLPDB1; --把 session 指定到 PDB
SQL>alter database open;
SQL>create user y04 identified by "y04"; --在當前 session 中建立一個 y04 且密碼為 y04 的帳號
SQL>grant dba to y04; --設定 y04 的資料庫權限,正常是不會直接給 dba 這個權限,不過我還不熟,先這樣吧
然後外部就可以用 y04 了,一樣外部用 DBeaver 連入
測試用的軟體 (DBeaver)
host: 192.168.1.113 //看你自己的 linux ip
port: 1521 //oracle default
database (=sid=service): orclpdb1 //就是pdb,因為剛剛已經把 session 切到這個 pdb 了,所以要改用這個
username: y04
password: y04
註1 本機 sqlplus 登入 y04 的方式
sqlplus 帳號/密碼@host/database(=sid=service)
sqlplus y04/y04@localhost/orclpdb1
註2 .base_profile
#oracle資料庫安裝目錄
export ORACLE_BASE=/opt/oracle
#oracle資料庫路徑
export ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1
#oracle啟動資料庫範例名
export ORACLE_SID=ORCLCDB
#xterm視窗模式安裝
export ORACLE_TERM=xterm
#設定時間格式
NLS_DATE_FORMAT="YYYY:MM:DDHH24:MI:SS"
#新增系統環境變數
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
#新增系統環境變數
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
#防止安裝過程出現亂碼
#export LANG=en_US.gbk
export LANG=en_US.UTF-8
#設定Oracle使用者端字元集,必須與Oracle安裝時設定的字元集保持一致,
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
2018年6月21日 星期四
Swashbuckle (3) 顯示 webapi 方法上 xml 的摘要
環境:vs2017、.net framework 4.7、Swashbuckle 5.6.0
首先建立好一個 WebApi 專案和透過 Nuget 裝好 Swashbuckle,並且透過
http://localhost:xxxxx/swagger 能夠進到 Swashbuckle 的頁面。
本篇的目的在於讓 Api 上面的 xml 註解中的資訊出現在 swagger 的頁面上
在安裝好 swashbuckle 後開啟 App_Start 中的 SwaggerConfig.cs,這個檔案
應該在 Nuget 安裝好 Swashbuckle 時就自動產生。
取消 SwaggerConfig.cs 中的下面這一行的註解
c.IncludeXmlComments(GetXmlCommentsPath());
在同一個 Class ( public class SwaggerConfig ) 下增加方法
internal static string GetXmlCommentsPath() { //透過設定專案的屬性,設定在建置後生成 XmlDocument.xml, //此處是設定 Swagger 參考這份 xml return string.Format(@"{0}\App_Data\XmlDocument.xml", System.AppDomain.CurrentDomain.BaseDirectory); }
圖上刪了很多原本是註解掉的部份
/// <summary> /// 人員 /// </summary> public class Person { /// <summary> /// 人員名稱 /// </summary> public string Name { get; set; } /// <summary> /// 人員年紀 /// </summary> public int Age { get; set; } } /// <summary> /// 錯誤狀態 /// </summary> public class ErrorStatus { /// <summary> /// 狀態代碼 /// </summary> public string StatusCode { get; set; } /// <summary> /// 狀態描述 /// </summary> public string Description { get; set; } }
public class PeopleController : ApiController { /// <summary> /// 取得人員資料 /// </summary> /// <remarks> /// 取得人員資料 api 的補充說明 /// </remarks> /// <param name="id">人員 Id</param> /// <response code="200">成功</response> /// <response code="404">找不到</response> /// <response code="500">內部伺服器錯誤</response> [ResponseType(typeof(Person))] public IHttpActionResult Get(string id) { return Ok(new Person()); } }
如果設定了 [ResponseType(typeof(Person))] 因為他預設是在 Http Status 200
的時候所回傳的類別,所以需要同時設定 <response code="200">成功</response>
才會正常顯示 [ResponseType(typeof(Person))] 的部份
在傳入值或回傳值,切換到 Model 下時會顯示定義在 DataModel 上的 <summary> 訊息
執行專案,然後接下來進到 Swagger 頁面就可以看到 webapi 上設定的 xml 註解的資訊
在比較新版的 Swashbuckle 中,可以利用 SwaggerResponse 這個 attribute 來取代
<response code=""></response>
public class PeopleController : ApiController { /// <summary> /// 取得人員資料 /// </summary> /// <remarks> /// 取得人員資料 api 的補充說明 /// </remarks> /// <param name="id">人員 Id</param> [SwaggerResponse(HttpStatusCode.OK, Description = "成功", Type = typeof(Person))] [SwaggerResponse(HttpStatusCode.NotFound, Description = "找不到")] [SwaggerResponse(HttpStatusCode.InternalServerError, Description = "內部伺服器錯誤", Type = typeof(ErrorStatus))] [ResponseType(typeof(Person))] public IHttpActionResult Get(string id) { return Ok(new Person()); } }