APEXからメールするならAPEX_MAILの方が簡単。
- Source
Oracle Application Express Notes | Apps development Notes | Google Cloud Platform | Python | apps test | Cool Beans | English | Books
-- 日付フォーマット | |
alter SESSION set NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'; | |
-- DDL の 確認 | |
select * from user_objects order by last_ddl_time DESC; | |
-- オラクルのバージョン確認 | |
select * from v$version; | |
-- 日付範囲指定 | |
CREATION_DATE >= to_date('01/01/2014', 'MM/DD/YYYY') | |
-- 日付の範囲指定 FROM TO 変数 | |
WHERE (@FROM IS NULL or TRUNC(<DATE>) >= @FROM) | |
AND (@TO IS NULL or TRUNC(<DATE>) <= @TO) | |
-- Table 一覧 | |
select * from tab; | |
-- 出力 | |
dbms_output.put_line (); | |
-- job スケジュール | |
SELECT * FROM user_scheduler_jobs; | |
-- job スケジュール material viewの場合 | |
SELECT * FROM dba_JOBS; | |
-- View の中身 | |
select view_name, text from user_views where view_name=''; | |
-- APEX_MAIL ログ | |
select * from APEX_MAIL_LOG order by LAST_UPDATED_ON desc; | |
-- APEX_MAIL キュー | |
select * from APEX_MAIL_QUEUE; | |
-- USER 一覧 | |
select * from dba_users; | |
-- DB link の一覧 | |
SELECT * FROM DBA_DB_LINKS; | |
‐‐ 制約条件一覧 | |
select constraint_name,constraint_type,table_name,status from user_constraints where table_name = '<tablename>'; | |
constraint_type | |
C - 表でのチェック制約 | |
P - 主キー | |
U - 一意のキー | |
R - 参照整合性 | |
V - ビューでのチェック・オプション付き | |
O - ビューで読取り専用 | |
H - ハッシュ式 | |
F - REF列を含む制約 | |
S - サプリメンタル・ロギング | |
--ULT_FILE のDirectoryの名前を調べる時 | |
SELECT DIRECTORY_NAME,DIRECTORY_PATH FROM ALL_DIRECTORIES; | |
--上記Directoryに対する権限を調べる | |
SELECT TABLE_NAME, PRIVILEGE FROM USER_TAB_PRIVS_RECD WHERE TABLE_NAME = '<DIRECTORY_NAME>'; | |
-- UTLパッケージの有無確認 | |
select * from all_objects where object_type = 'PACKAGE BODY' and OBJECT_NAME like 'UTL%'; | |
-- Table spaceの確認 | |
select a.TABLESPACE_NAME | |
, min(a.BYTES)/1024/1024 size_mb | |
, round(min(a.BYTES)/(1024*1024) - sum(b.BYTES)/ (1024*1024),2) usage_mb | |
, round((min(a.BYTES)/(1024*1024) - sum(b.BYTES)/(1024*1024))/ (min(a.BYTES)/1024/1024)*100,2) "usage(%)" | |
, round(sum(b.BYTES)/(1024*1024),2) free_mb | |
from dba_data_files a, dba_free_space b | |
where a.FILE_ID = b.FILE_ID | |
group by a.TABLESPACE_NAME; |
BEGIN | |
--SET APP_USER | |
apex_application.g_user := 'EDI'; | |
-- | |
UPDATE TABLE_NAME SET a = 1; | |
END; |
-- 日付の藩士指定 | |
SELECT * FROM dual where [date] >= convert(datetime,'01/01/2015',101); | |
--- NULL と Blankを除く | |
WHERE COALESCE ([column_name], '') <> '' | |
-- 日付データから時間情報をカット、Oracleの Trunc()の代替 -- SQLSERVER 2008 以上 | |
cast(<DATE> as DATE) | |
-- 日付データから時間情報をカット、Oracleの Trunc()の代替 -- SQLSERVER 2008 未満 | |
dateadd(dd, datediff(dd,0, <DATE>), 0) | |
-- 日付データから時間情報をカット、Oracleの Trunc()の代替 -- SQLSERVER 2008 以上 | |
WHERE (@FROM IS NULL or cast(<DATE> as DATE) >= @FROM) | |
AND (@TO IS NULL or cast(<DATE> as DATE) <= @TO) | |
-- 日付データから時間情報をカット、Oracleの Trunc()の代替 -- SQLSERVER 2008 未満 | |
WHERE (@FROM IS NULL or dateadd(dd, datediff(dd,0, <DATE>), 0) >= @FROM) | |
AND (@TO IS NULL or dateadd(dd, datediff(dd,0, <DATE>), 0) <= @TO) | |
-- ダミーテーブル Oracle のDualの代替 - FROM句を付けないだけ! | |
select cast(getdate() as DATE) | |
-- Transaction log | |
select * from ::fn_dblog(null,null) | |
‐‐ シングルユーザーモード変更 | |
ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE; | |
-- DBのリネーム | |
EXEC sp_renamedb 'oldname', 'newname'; | |
-- 改行削除 | |
REPLACE(REPLACE(FirstName, CHAR(13), ''), CHAR(10), '') | |
-- Rollback 出来るようにSQLを流す | |
BEGIN TRANSACTION | |
DELETE FROM <table> WHERE .... | |
-- Commit する | |
COMMIT TRANSACTION | |
ーー Rollback する | |
ROLLBACK TRANSACTION |
create or replace procedure PWD_INITIALIZATION(p_user_id in NUMBER) | |
IS | |
l_username VARCHAR2(2000); | |
l_useremail VARCHAR2(100); | |
l_sendemail VARCHAR2(100); -- need to set FROM address | |
l_fullname VARCHAR2(30); | |
l_ini_pwd VARCHAR2(8); | |
l_body VARCHAR2(2000) := 'This is HTML mail. If you cannot see the mail body, please contact XXXX.'; | |
l_body_html VARCHAR2(4000); | |
l_subj VARCHAR2(300); | |
BEGIN | |
--- Getting user info for sending notification | |
select USERNAME,EMAIL_ADDRESS,FULL_NAME | |
into l_username,l_useremail,l_fullname | |
from USERMASTER | |
where USER_ID = p_user_id; | |
-- Create initial password | |
select dbms_random.string('A',8) into l_ini_pwd from sys.dual; | |
-- Set initial password in USERMASTER | |
UPDATE USERMASTER SET PWD = MD5_HASH(l_username,l_ini_pwd) | |
,PWD_EXPIRE = '1' ---Set EXPIRE flag | |
where USER_ID = p_user_id; | |
-- sending temporary pwd. | |
--Creating EMAIL subject | |
l_subj := 'Temporary PWD notification.'; | |
-- Creating EMAIL HTML BODY | |
l_body_html := '<HTML><BODY><PRE><span style="font-family:monospace;"><BR>'; | |
l_body_html := l_body_html||'Dear Sir or Madam,<BR><BR>'; | |
l_body_html := l_body_html||'Your temporaly Password is '||l_ini_pwd||' . <BR><BR>'; | |
l_body_html := l_body_html||'Go to --> http://--------'; | |
-- End part of Email body | |
l_body_html := l_body_html||'Regards,<BR>'; | |
l_body_html := l_body_html||'</span></PRE></BODY></HTML>'; | |
-- send email with apex_mail | |
wwv_flow_api.set_security_group_id; | |
apex_mail.send (p_to => l_useremail, | |
p_from => l_sendemail, | |
p_body => l_body, | |
p_body_html => l_body_html, | |
p_subj => l_subj); | |
END; |
CREATE SEQUENCE "USERMASTER_SEQ" | |
MINVALUE 1 | |
MAXVALUE 9999999999999999999999999999 | |
INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOPARTITION | |
/ | |
CREATE TABLE "USERMASTER" | |
( "USER_ID" NUMBER NOT NULL ENABLE, | |
"USERNAME" VARCHAR2(20) NOT NULL ENABLE, | |
"FULL_NAME" VARCHAR2(100) NOT NULL ENABLE, | |
"EMAIL_ADDRESS" VARCHAR2(100) NOT NULL ENABLE, | |
"PWD_EXPIRE" NUMBER(1,0) NOT NULL ENABLE, | |
"PWD" VARCHAR2(60) NOT NULL ENABLE, | |
CONSTRAINT "USERMASTER_PK" PRIMARY KEY ("USER_ID") | |
USING INDEX ENABLE, | |
CONSTRAINT "USERMASTER_UK1" UNIQUE ("USERNAME") | |
USING INDEX ENABLE, | |
CONSTRAINT "USERMASTER_UK2" UNIQUE ("EMAIL_ADDRESS") | |
USING INDEX ENABLE | |
) | |
/ | |
CREATE OR REPLACE EDITIONABLE TRIGGER "BI_USERMASTER" | |
before insert on "USERMASTER" | |
for each row | |
begin | |
if :NEW."USER_ID" is null then | |
select "USERMASTER_SEQ".nextval into :NEW."USER_ID" from sys.dual; | |
end if; | |
end; | |
/ | |
ALTER TRIGGER "BI_USERMASTER" ENABLE | |
/ |
create or replace Function CHGPWD(p_user_id in NUMBER, -- USERMASTER の key | |
p_username in VARCHAR2, -- USERNAME | |
p_old_pwd in VARCHAR2, -- old password | |
p_new_pwd in VARCHAR2, -- new password | |
p_con_pwd in VARCHAR2) -- confirm new password | |
return BOOLEAN | |
IS | |
l_flag NUMBER; | |
BEGIN | |
-- Check パスワードと確認パスワードの確認(不要かも) | |
IF p_new_pwd != p_con_pwd THEN | |
RETURN FALSE; | |
END IF; | |
-- 現状のパスワードの確認 | |
select 1 into l_flag from USERMASTER a | |
where a.USER_ID = p_user_id | |
and a.PWD = SHA1_HASH(p_username,p_old_pwd) ---MD5_HASH(p_username,p_old_pwd) | |
and upper(a.USERNAME) = upper(p_username); | |
-- 現状のパスワードが一致した時のみパスワードを更新する | |
IF l_flag = 1 THEN | |
UPDATE USERMASTER a SET a.PWD = SHA1_HASH(p_username,p_new_pwd) ---MD5_HASH(p_username,p_new_pwd) | |
,a.PWD_EXPIRE = 0 -- Expireをフラグ管理 | |
where a.USER_ID = p_user_id | |
and a.PWD = SHA1_HASH(p_username,p_old_pwd) ------MD5_HASH(p_username,p_old_pwd) | |
and upper(a.USERNAME) = upper(p_username); | |
RETURN TRUE; | |
ELSE | |
RETURN FALSE; | |
END IF; | |
END; |
CREATE OR REPLACE FUNCTION AUTH (p_username IN VARCHAR2,p_password IN VARCHAR2 ) | |
RETURN BOOLEAN | |
IS | |
l_pwd VARCHAR2(60); | |
l_value NUMBER; | |
l_returnvalue BOOLEAN; | |
BEGIN | |
select SHA1_HASH(p_username,p_password) into l_pwd from dual; | |
BEGIN | |
SELECT 1 | |
INTO l_value | |
FROM USERMASTER -- User master table -- | |
WHERE 1=1 | |
AND upper(USERNAME) = upper(p_username) | |
AND upper(PWD) = upper(l_pwd); | |
EXCEPTION | |
WHEN no_data_found | |
OR too_many_rows THEN | |
l_value := 0; | |
WHEN OTHERS THEN | |
l_value := 0; | |
END; | |
l_returnvalue := l_value = 1; | |
RETURN l_returnvalue; | |
END; |
select replace(translate(<input sentence>, | |
replace(translate(<input sentence>,<search letter>, | |
<dummy letter>),''),'x'),'x','') from dual; | |
--- EX) select alphabet only | |
select replace(translate(upper('123 My 4566,,, name .. is 0#$%0 John.'), | |
replace(translate(upper('123 My 4566,,, name .. is 0#$%0 John.'), | |
'ABCDEFGHIJKLMNOPQRSTUVWXYZ','0'),''),'x'),'x','') from dual; | |
---- | |
----Result | |
---- | |
MYNAMEISJOHN |
create or replace function "MD5_HASH" | |
(g_user_name in VARCHAR2, | |
g_password in VARCHAR2) | |
return VARCHAR2 | |
is | |
l_password VARCHAR2 (4000); | |
l_salt VARCHAR2 (4000) := 'SALTSALTSALTSALTSALT'; -- Need to change your original. | |
BEGIN | |
l_password := | |
UTL_RAW.cast_to_raw (DBMS_OBFUSCATION_TOOLKIT.md5 (input_string => g_password | |
|| SUBSTR ( l_salt, 13, 16) | |
|| upper(g_user_name) | |
|| SUBSTR ( l_salt, 4, 10))); | |
RETURN l_password; | |
end; |
CREATE OR REPLACE function SHA1_HASH(p_username in VARCHAR2,p_password in VARCHAR2) | |
return VARCHAR2 | |
is | |
l_password VARCHAR2 (4000); | |
l_salt VARCHAR2 (4000) := 'SALTSALTSALTSALTSALTSALT'; -- change with your salt. | |
BEGIN | |
l_password := | |
DBMS_CRYPTO.HASH(src => UTL_I18N.STRING_TO_RAW(p_password | |
|| SUBSTR ( l_salt, 10, 13) | |
|| upper(p_username) | |
|| SUBSTR( l_salt, 4, 10),'AL32UTF8'), | |
typ => DBMS_CRYPTO.HASH_SH1 | |
); | |
RETURN l_password; | |
END; |
create or replace procedure "APEX_MAIL_IN_PROCEDURE" | |
is | |
l_to VARCHAR2(100) :='<test_email_address>'; | |
l_from VARCHAR2(100) :='<test_email_address>'; | |
l_cc VARCHAR2(100); | |
l_body VARCHAR2(2000) :='test'; | |
l_body_html VARCHAR2(4000); | |
l_subj VARCHAR2(300) :='test'; | |
BEGIN | |
-- | |
--Need to add this line. | |
wwv_flow_api.set_security_group_id; | |
-- | |
-- | |
apex_mail.send (p_to => l_to, | |
p_from => l_from, | |
p_cc => l_cc, | |
p_body => l_body, | |
p_body_html => l_body_html, | |
p_subj => l_subj); | |
END; |
create or replace TRIGGER "<TRIGGER NAME>" | |
BEFORE | |
insert or update on "<table name>" | |
for each row | |
begin | |
IF INSERTING | |
THEN | |
:new.creation_date := sysdate; | |
--adding user name(This is for apex apps case.) | |
:new.created_by := NVL(v('APP_USER'), 0); | |
END IF; | |
:new.last_update_date := sysdate; | |
--adding user name(This is for apex apps case.) | |
:new.last_updated_by := NVL(v('APP_USER'), 0); | |
end; |