- http://localhost:8181/ords/r/apexdev/demonstration-emp-dept/dashboardを開いて
- ユーザー名とパスワードは自分で入力します。
- サインインできました。
- Employeesの一覧を開いて
- SCOTTのSalaryを3000から4000に変更して
- いえ、これでいいです。ありがとう!
2025年3月29日土曜日
Playwright MCPを使ってOracle APEXのアプリケーションを操作する
MicrosoftのPlaywrightを使ってAPEXアプリケーションのE2Eテストを行う
- Dashboardのカードをクリックし、Dashboardのページが開くことを確認します。
- Employeesのカードをクリックし、Employeesのファセット検索のページが開くことを確認します。
- Departmentsのカードをクリックし、Departmentsの対話モード・レポートのページが開くことを確認します。
<input type="text" id="P9999_USERNAME" name="P9999_USERNAME" placeholder="ユーザー名" class="text_field apex-item-text apex-item-has-icon" autocomplete="username" value="admin" size="40" maxlength="100" data-enter-submit="false" data-is-page-item-type="true">
<button class="t-Button t-Button--hot lto18565948643221472_0" type="button" id="B18565948643221472" data-otel-label="LOGIN"><span class="t-Button-label">サインイン</span></button>
<button class="t-Button t-Button--hot lto18565948643221472_0" type="button" id="LOGIN" data-otel-label="LOGIN"><span class="t-Button-label">サインイン</span></button>
<a href="/ords/r/apexdev/demonstration-emp-dept106/dashboard?session=8435741618687" class="t-Card-wrap" data-otel-label="">
<div class="t-Card-icon u-color "><span class="t-Icon fa fa-dashboard"><span class="t-Card-initials" role="presentation"></span></span></div>
<div class="t-Card-titleWrap">
<h3 class="t-Card-title">Dashboard</h3>
<h4 class="t-Card-subtitle"></h4>
</div>
<div class="t-Card-body">
<div class="t-Card-desc"></div>
<div class="t-Card-info"></div>
</div>
<span class="t-Card-colorFill u-color " aria-hidden="true"></span>
</a>
ページの設定を確認します。<a href="#LINK#" class="t-Card-wrap" #A05# data-otel-label="#A10#">
% mkdir Playwright
%
% cd Playwright
Playwright % npm init playwright@latest
> npx
> create-playwright
Getting started with writing end-to-end tests with Playwright:
Initializing project in '.'
✔ Do you want to use TypeScript or JavaScript? · TypeScript
✔ Where to put your end-to-end tests? · tests
✔ Add a GitHub Actions workflow? (y/N) · false
✔ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n) · true
Initializing NPM project (npm init -y)…
Wrote to /Users/ynakakoshi/Documents/Playwright/package.json:
{
"name": "playwright",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": ""
}
Installing Playwright Test (npm install --save-dev @playwright/test)…
added 3 packages, and audited 4 packages in 1s
found 0 vulnerabilities
Installing Types (npm install --save-dev @types/node)…
added 3 packages, and audited 7 packages in 640ms
found 0 vulnerabilities
Writing playwright.config.ts.
Writing tests/example.spec.ts.
Writing tests-examples/demo-todo-app.spec.ts.
Writing package.json.
Downloading browsers (npx playwright install)…
✔ Success! Created a Playwright Test project at /Users/ynakakoshi/Documents/Playwright
Inside that directory, you can run several commands:
npx playwright test
Runs the end-to-end tests.
npx playwright test --ui
Starts the interactive UI mode.
npx playwright test --project=chromium
Runs the tests only on Desktop Chrome.
npx playwright test example
Runs the tests in a specific file.
npx playwright test --debug
Runs the tests in debug mode.
npx playwright codegen
Auto generate tests with Codegen.
We suggest that you begin by typing:
npx playwright test
And check out the following files:
- ./tests/example.spec.ts - Example end-to-end test
- ./tests-examples/demo-todo-app.spec.ts - Demo Todo App end-to-end tests
- ./playwright.config.ts - Playwright Test configuration
Visit https://playwright.dev/docs/intro for more information. ✨
Happy hacking! 🎭
Playwright %
import { defineConfig, devices } from '@playwright/test'; | |
/** | |
* Read environment variables from file. | |
* https://github.com/motdotla/dotenv | |
*/ | |
// import dotenv from 'dotenv'; | |
// import path from 'path'; | |
// dotenv.config({ path: path.resolve(__dirname, '.env') }); | |
/** | |
* See https://playwright.dev/docs/test-configuration. | |
*/ | |
export default defineConfig({ | |
testDir: './tests', | |
/* Run tests in files in parallel */ | |
fullyParallel: true, | |
/* Fail the build on CI if you accidentally left test.only in the source code. */ | |
forbidOnly: !!process.env.CI, | |
/* Retry on CI only */ | |
retries: process.env.CI ? 2 : 0, | |
/* Opt out of parallel tests on CI. */ | |
workers: process.env.CI ? 1 : undefined, | |
/* Reporter to use. See https://playwright.dev/docs/test-reporters */ | |
reporter: 'html', | |
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ | |
use: { | |
/* Base URL to use in actions like `await page.goto('/')`. */ | |
// baseURL: 'http://127.0.0.1:3000', | |
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ | |
trace: 'on-first-retry', | |
}, | |
/* Configure projects for major browsers */ | |
projects: [ | |
{ | |
name: 'chromium', | |
use: { | |
...devices['Desktop Chrome'], | |
viewport: { width: 1280, height: 1280 }, | |
storageState: './.auth/state.json', | |
}, | |
}, | |
{ | |
name: 'firefox', | |
use: { ...devices['Desktop Firefox'] }, | |
}, | |
{ | |
name: 'webkit', | |
use: { ...devices['Desktop Safari'] }, | |
}, | |
/* Test against mobile viewports. */ | |
// { | |
// name: 'Mobile Chrome', | |
// use: { ...devices['Pixel 5'] }, | |
// }, | |
// { | |
// name: 'Mobile Safari', | |
// use: { ...devices['iPhone 12'] }, | |
// }, | |
/* Test against branded browsers. */ | |
// { | |
// name: 'Microsoft Edge', | |
// use: { ...devices['Desktop Edge'], channel: 'msedge' }, | |
// }, | |
// { | |
// name: 'Google Chrome', | |
// use: { ...devices['Desktop Chrome'], channel: 'chrome' }, | |
// }, | |
], | |
/* Run your local dev server before starting the tests */ | |
// webServer: { | |
// command: 'npm run start', | |
// url: 'http://127.0.0.1:3000', | |
// reuseExistingServer: !process.env.CI, | |
// }, | |
}); |
import { test as base } from "@playwright/test"; | |
import path from 'path'; | |
import * as fs from 'fs'; | |
/* | |
* プロジェクトのフォルダ直下に.authフォルダを作成し、その中にauth.jsonを作成する。 | |
* auth.jsonの中身は以下のようにする。 | |
* ログイン・ユーザー名とパスワードは、実際のものに置き換えること。 | |
* {"username":"admin","password":"4fae#ae2ef3!!","sessionId":"17291688537780"} | |
* | |
* 初回実行時のために、state.jsonファイルを作成しておく。 | |
* echo "{}" > .auth/state.json | |
* | |
* BASE_URLは、テスト実行時に使用するURLを指定する。 | |
*/ | |
export const authFile = path.join(__dirname, '../.auth/auth.json'); | |
export const BASE_URL = 'http://localhost:8181/ords/r/apexdev/demonstration-emp-dept'; | |
const stateFile = path.join(__dirname, '../.auth/state.json'); | |
export const test = base.extend({ | |
// Create a custom fixture | |
loginUser: async ({ page }, use) => { | |
// auth.jsonからユーザー名とパスワードを取り出す。 | |
const auth = JSON.parse(fs.readFileSync(authFile, 'utf8')); | |
/* | |
* 最初にホーム・ページにアクセスするが、URLにsession=が含まれていないため、ログイン・ページに遷移する。 | |
*/ | |
await page.goto(`${BASE_URL}/home`); | |
/* | |
* ページ・作成ウィザードが生成したログイン・ページであれば、 | |
* ページ・アイテム名がIDと同じINPUT要素が作成されている。 | |
*/ | |
await page.fill("input#P9999_USERNAME", auth.username); | |
await page.fill("input#P9999_PASSWORD", auth.password); | |
// await page.click("input#P9999_REMEMBER"); | |
// サインイン・ボタンをクリックする。ボタンに静的IDとしてLOGINを設定する必要がある。 | |
await page.click("button#LOGIN"); | |
/* | |
* サインインに成功した後、ホーム・ページに遷移する。 | |
* ページ・遷移後のURLからsessioin=の引数に設定されている | |
* セッションIDを取り出し、auth.jsonに保存する。 | |
* このセッションIDを後続のテストで使用する。 | |
* | |
* 完全にホーム・ページに遷移したことを確認するためにwaitForSelectorを呼び出しているが、 | |
* もっと汎用的な方法があるはず。 | |
*/ | |
await page.waitForSelector('#menu-dashboard'); | |
// URLからセッションIDを取り出す。 | |
const homeURL = new URL(page.url()); | |
const sessionId = homeURL.searchParams.get('session'); | |
// auth.jsonにsessionIdとして保存する。 | |
const newAuth = { ...auth, sessionId: sessionId }; | |
fs.writeFileSync(authFile, JSON.stringify(newAuth)); | |
// console.log('afer signin - auth', newAuth); | |
/* | |
* contextをstate.jsonに保存する。 | |
*/ | |
await page.context().storageState({ path: stateFile }); | |
// const cookies = await page.context().cookies(); | |
// console.log('cookies', cookies); | |
// Pass control back to the test | |
await use(); | |
}, | |
}); |
{"username":"admin","password":"4fae#ae2ef3!!","sessionId":"17291688537780"}
import { expect } from '@playwright/test'; | |
import { test, authFile, BASE_URL } from './fixtures.ts'; | |
import path from 'path'; | |
import * as fs from 'fs'; | |
test('open Dashboard', async ({ page, loginUser }) => { | |
/* | |
* fixtures.jsに記載されているloginUserが呼び出される。 | |
* サインインに成功した後は、ホーム・ページが開かれている。 | |
*/ | |
// 表示されているページにダッシュボードのカードがあることを確認する。 | |
await page.waitForSelector('#menu-dashboard', { timeout: 5000 }); | |
// ダッシュボードのカードをクリックする。#menu-dashboardはAPEX側に要設定。 | |
await page.click("a#menu-dashboard"); | |
// ダッシュボードのページが開かれていることを確認する。 | |
await expect(page).toHaveTitle('Dashboard'); | |
}); | |
/* | |
test('verify', async ({ page }) => { | |
// call page without fixture. | |
await page.goto('http://localhost:8181/ords/apexdev/test/test'); | |
}); | |
*/ | |
test('open Employees', async ({ page }) => { | |
/* | |
* loginUserは呼び出さず、サインインが継続している状態から始める。 | |
* auth.jsonに保存されているsessionIdを使用して、ホームページを開く。 | |
* auth.jsonは、fixtures.jsのloginUserで、サインイン時にsessionIdが更新されている。 | |
*/ | |
const auth = JSON.parse(fs.readFileSync(authFile, 'utf8')); | |
// ホーム・ページを開く。 | |
const home_url = `${BASE_URL}/home?session=${auth.sessionId}`; | |
console.log(home_url); | |
await page.goto(home_url); | |
// ホーム・ページに従業員一覧のカードがあることを確認し、クリックする。#menu-employeesはAPEX側に要設定。 | |
await page.waitForSelector('#menu-employees', { timeout: 3000 }); | |
await page.click("a#menu-employees"); | |
// 従業員のページが開かれていることを確認する。 | |
await expect(page).toHaveTitle('Employees'); | |
}); | |
test('open Departments', async ({ page }) => { | |
/* | |
* 従業員一覧に同じ。 | |
*/ | |
const auth = JSON.parse(fs.readFileSync(authFile, 'utf8')); | |
// ホーム・ページを開く。 | |
const home_url = `${BASE_URL}/home?session=${auth.sessionId}`; | |
console.log(home_url); | |
await page.goto(home_url); | |
// ホーム・ページに部門一覧のカードがあることを確認し、クリックする。#menu-departmentsはAPEX側に要設定。 | |
await page.waitForSelector('#menu-departments', { timeout: 3000 }); | |
await page.click("a#menu-departments"); | |
// 部門のページが開かれていることを確認する。 | |
await expect(page).toHaveTitle('Departments'); | |
}); |
2025年3月27日木曜日
Oracle Database Free 23ai 23.7にDBMS_CLOUDファミリーのパッケージをインストールする
podman run -d --name oradb -p 1521:1521 container-registry.oracle.com/database/free:latest
% podman run -d --name oradb -p 1521:1521 container-registry.oracle.com/database/free:latest
5966443f8868e0372d28bbec70e8cb748413a0427a8f8c4300740be8246de324
%
podman exec -it oradb ./setPassword.sh [SYSのパスワード]
% podman exec -it oradb ./setPassword.sh [SYSのパスワード]
The Oracle base remains unchanged with value /opt/oracle
SQL*Plus: Release 23.0.0.0.0 - Production on Thu Mar 27 04:10:38 2025
Version 23.7.0.25.01
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.7.0.25.01
SQL>
User altered.
SQL>
User altered.
SQL>
Session altered.
SQL>
User altered.
SQL> Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.7.0.25.01
%
podman exec -it oradb bash
% podman exec -it oradb bash
bash-4.4$
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/your-password -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp catclouduser.sql
bash-4.4$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/[SYSのパスワード] -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp catclouduser.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/dbms_cloud_install_catcon_1021.lst]
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install_*.lst] files for spool files, if any
catcon::get_kill_sess_script_info: query produced 2 rows instead of expected 3 rows corresponding to processes 1070, 1071, 1072
catcon.pl: completed successfully
bash-4.4$
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/your-password -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp dbms_cloud_install.sql
bash-4.4$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/[SYSのパスワード] -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp dbms_cloud_install.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/dbms_cloud_install_catcon_1226.lst]
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install_*.lst] files for spool files, if any
catcon.pl: completed successfully
bash-4.4$
select con_id, owner, object_name, status, sharing, oracle_maintained from cdb_objects where object_name like 'DBMS_CLOUD%';
bash-4.4$ sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - Production on Thu Mar 27 04:28:57 2025
Version 23.7.0.25.01
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.7.0.25.01
SQL> set pages 1000 lines 180 trims on trimo on
SQL> col con_id format 9999
SQL> col owner format a18
SQL> col object_name format a30
SQL> col status format a8
SQL> col sharing format a16
SQL> col oracle_maintained format a3
SQL> select con_id, owner, object_name, status, sharing, oracle_maintained from cdb_objects where object_name like 'DBMS_CLOUD%';
CON_ID OWNER OBJECT_NAME STATUS SHARING ORA
------ ------------------ ------------------------------ -------- ---------------- ---
1 PUBLIC DBMS_CLOUD VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_AI VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_CORE VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_OCI_REGIONS VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_REPO VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_TYPES VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_ATTR$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_SCHEMA$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CLOUD_STORE_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM VALID DATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS VALID DATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PARAM_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR_I1$ VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE_I1$ VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_I1$ VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REST_API_RESULTS$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_STORE VALID DATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_STORE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASKS VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLEANUP VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_ID VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TYPES VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_AI VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_CORE VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_OCI_REGIONS VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_REPO VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_TYPES VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_ATTR$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_SCHEMA$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CLOUD_STORE_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM VALID DATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS VALID DATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PARAM_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR_I1$ VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE_I1$ VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_I1$ VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REST_API_RESULTS$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_STORE VALID DATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_STORE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASKS VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLEANUP VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_ID VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TYPES VALID METADATA LINK Y
128 rows selected.
SQL>
select owner, object_name, status, sharing, oracle_maintained from dba_objects where object_name like 'DBMS_CLOUD%';
SQL> alter session set container = freepdb1;
Session altered.
SQL> select owner, object_name, status, sharing, oracle_maintained from dba_objects where object_name like 'DBMS_CLOUD%';
OWNER OBJECT_NAME STATUS SHARING ORA
------------------ ------------------------------ -------- ---------------- ---
PUBLIC DBMS_CLOUD VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_AI VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_CORE VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_OCI_REGIONS VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_REPO VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_TYPES VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_ATTR$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_SCHEMA$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES_UNIQUE VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_CLOUD_STORE_UNIQUE VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM VALID DATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM_UNIQUE VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS VALID DATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS_UNIQUE VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_PARAM_UNIQUE VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR_I1$ VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE_I1$ VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_I1$ VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_REST_API_RESULTS$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_STORE VALID DATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_STORE$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_TASKS VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS$ VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS_UNIQUE VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLEANUP VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_TASK_ID VALID NONE Y
C##CLOUD$SERVICE DBMS_CLOUD_TYPES VALID METADATA LINK Y
64 rows selected.
SQL>
begin
dbms_network_acl_admin.append_host_ace(
host => '*',
ace => xs$ace_type(
privilege_list => xs$name_list('http','http_proxy'),
principal_name => 'C##CLOUD$SERVICE',
principal_type => xs_acl.ptype_db
)
);
commit;
end;
/
SQL> alter session set container = cdb$root;
Session altered.
SQL> begin
dbms_network_acl_admin.append_host_ace(
host => '*',
ace => xs$ace_type(
privilege_list => xs$name_list('http','http_proxy'),
principal_name => 'C##CLOUD$SERVICE',
principal_type => xs_acl.ptype_db
)
);
commit;
end;
/ 2 3 4 5 6 7 8 9 10 11 12
PL/SQL procedure successfully completed.
SQL>
SQL> alter session set container = freepdb1;
Session altered.
SQL> begin
dbms_network_acl_admin.append_host_ace(
host => '*',
ace => xs$ace_type(
privilege_list => xs$name_list('http','http_proxy'),
principal_name => 'C##CLOUD$SERVICE',
principal_type => xs_acl.ptype_db
)
);
commit;
end;
/ 2 3 4 5 6 7 8 9 10 11 12
PL/SQL procedure successfully completed.
SQL>
20.6で紹介されている検証用のスクリプトを実行します。
define clouduser=C##CLOUD$SERVICE | |
-- CUSTOMER SPECIFIC SETUP, NEEDS TO BE PROVIDED BY THE CUSTOMER | |
-- - SSL Wallet directory and password | |
-- define sslwalletdir=<Set SSL Wallet Directory> | |
-- define sslwalletpwd=<Set SSL Wallet password> | |
-- In environments w/ a proxy, you need to set the proxy in the verification code | |
-- define proxy_uri=<your proxy URI address> | |
-- create and run this procedure as owner of the ACLs, which is the future owner | |
-- of DBMS_CLOUD | |
CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS | |
request_context UTL_HTTP.REQUEST_CONTEXT_KEY; | |
req UTL_HTTP.REQ; | |
resp UTL_HTTP.RESP; | |
data VARCHAR2(32767) default null; | |
err_num NUMBER default 0; | |
err_msg VARCHAR2(4000) default null; | |
BEGIN | |
-- | |
-- wallet_pathはsystem:固定. | |
-- | |
-- Create a request context with its wallet and cookie table | |
request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT( | |
wallet_path => 'system:' | |
); | |
-- Make a HTTP request using the private wallet and cookie | |
-- table in the request context | |
-- uncomment if proxy is required | |
-- UTL_HTTP.SET_PROXY('&proxy_uri', NULL); | |
req := UTL_HTTP.BEGIN_REQUEST(url => url,request_context => request_context); | |
resp := UTL_HTTP.GET_RESPONSE(req); | |
DBMS_OUTPUT.PUT_LINE('valid response'); | |
EXCEPTION | |
WHEN OTHERS THEN | |
err_num := SQLCODE; | |
err_msg := SUBSTR(SQLERRM, 1, 3800); | |
DBMS_OUTPUT.PUT_LINE('possibly raised PLSQL/SQL error: ' ||err_num||' - '||err_msg); | |
UTL_HTTP.END_RESPONSE(resp); | |
data := UTL_HTTP.GET_DETAILED_SQLERRM ; | |
IF data IS NOT NULL THEN | |
DBMS_OUTPUT.PUT_LINE('possibly raised HTML error: ' ||data); | |
END IF; | |
END; | |
/ | |
set serveroutput on | |
BEGIN | |
&clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com'); | |
END; | |
/ | |
set serveroutput off | |
drop procedure &clouduser..GET_PAGE; |
bash-4.4$ sqlplus / as sysdba @verify_dbms_cloud.sql
SQL*Plus: Release 23.0.0.0.0 - Production on Thu Mar 27 04:56:04 2025
Version 23.7.0.25.01
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.7.0.25.01
old 1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
new 1: CREATE OR REPLACE PROCEDURE C##CLOUD$SERVICE.GET_PAGE(url IN VARCHAR2) AS
Enter value for proxy_uri:
old 23: -- UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
new 23: -- UTL_HTTP.SET_PROXY('', NULL);
Procedure created.
old 2: &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
new 2: C##CLOUD$SERVICE.GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
valid response
PL/SQL procedure successfully completed.
old 1: drop procedure &clouduser..GET_PAGE
new 1: drop procedure C##CLOUD$SERVICE.GET_PAGE
Procedure dropped.
SQL>
alter session set container = freepdb1;
create user testuser default tablespace users temporary tablespace temp identified by testuser;
alter user testuser quota unlimited on users;
grant connect, resource, db_developer_role to testuser;
grant execute on dbms_cloud to testuser;
grant execute on dbms_cloud_pipeline to testuser;
grant execute on dbms_cloud_repo to testuser;
grant execute on dbms_cloud_notification to testuser;
grant execute on dbms_cloud_ai to testuser;
SQL> alter session set container = freepdb1;
Session altered.
SQL> create user testuser default tablespace users temporary tablespace temp identified by testuser;
User created.
SQL> alter user testuser quota unlimited on users;
User altered.
SQL> grant connect, resource, db_developer_role to testuser;
Grant succeeded.
SQL> grant execute on dbms_cloud to testuser;
Grant succeeded.
SQL> grant execute on dbms_cloud_pipeline to testuser;
Grant succeeded.
SQL> grant execute on dbms_cloud_repo to testuser;
Grant succeeded.
SQL> grant execute on dbms_cloud_notification to testuser;
Grant succeeded.
SQL> grant execute on dbms_cloud_ai to testuser;
Grant succeeded.
SQL>
begin
dbms_network_acl_admin.append_host_ace(
host => '*',
ace => xs$ace_type(
privilege_list => xs$name_list('http','http_proxy'),
principal_name => 'TESTUSER',
principal_type => xs_acl.ptype_db
)
);
commit;
end;
/
SQL> begin
dbms_network_acl_admin.append_host_ace(
host => '*',
ace => xs$ace_type(
privilege_list => xs$name_list('http','http_proxy'),
principal_name => 'TESTUSER',
principal_type => xs_acl.ptype_db
)
);
commit;
end;
/ 2 3 4 5 6 7 8 9 10 11 12
PL/SQL procedure successfully completed.
SQL>
% sql testuser/testuser@localhost/freepdb1
SQLcl: 木 3月 27 14:15:00 2025のリリース24.4 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
接続先:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.7.0.25.01
SQL>
create table emp (empno number primary key, ename varchar2(80), sal number, comm number);
SQL> create table emp (empno number primary key, ename varchar2(80), sal number, comm number);
Table EMPは作成されました。
SQL>
begin
dbms_cloud.create_credential(
credential_name => 'OPENAI_CRED'
,username => 'OPENAI'
,password => 'OpenAIのAPIキー'
);
end;
/
SQL> begin
2 dbms_cloud.create_credential(
3 credential_name => 'OPENAI_CRED'
4 ,username => 'OPENAI'
5 ,password => 'OpenAIのAPIキー'
6 );
7 end;
8* /
PL/SQLプロシージャが正常に完了しました。
SQL>
Select AIのプロファイルを作成します。
begin
dbms_cloud_ai.create_profile(
profile_name => 'OPENAI'
,attributes => '{"provider": "openai", "credential_name": "OPENAI_CRED",
"object_list": [{ "owner": "TESTUSER", "name": "EMP" }], "conversation": "true" }');
end;
/
SQL> begin
2 dbms_cloud_ai.create_profile(
3 profile_name => 'OPENAI'
4 ,attributes => '{"provider": "openai", "credential_name": "OPENAI_CRED",
5 "object_list": [{ "owner": "TESTUSER", "name": "EMP" }], "conversation": "true" }');
6 end;
7* /
PL/SQLプロシージャが正常に完了しました。
SQL>
作成したプロファイルをセットします。
begin
dbms_cloud_ai.set_profile('OPENAI');
end;
/
SQL> begin
2 dbms_cloud_ai.set_profile('OPENAI');
3 end;
4* /
PL/SQLプロシージャが正常に完了しました。
SQL>
セットされたプロファイルを確認します。
select dbms_cloud_ai.get_profile() from dual;
SQL> select dbms_cloud_ai.get_profile() from dual;
DBMS_CLOUD_AI.GET_PROFILE()
______________________________
"OPENAI"
SQL>
Select AIを呼び出してSQLを生成します。
select ai showsql how many employees exist;
SQL> select ai showsql how many employees exist;
RESPONSE
___________________________________
SELECT COUNT(*) AS num_employees
FROM "TESTUSER"."EMP"
SQL>
以上で、インストールしたDBMS_CLOUD関連パッケージの動作が確認できました。
utl_http.set_wallet('system:');
DBMS_CLOUD_REPOは以下の記事で使用しています。ローカルにインストールしたアプリケーションを動かしたところ、概ね動きました。