原始出處:
執行環境:sqlplus, serveroutput已開啟
我們正在建立乙個應用,使用者可以選擇他們的考題難度。他們可以選擇某種特定難度,也可以指定乙個範圍。我們用整數值來代表這些選項:
1 beginner only
2 beginner -> intermediate
3 intermediate
4 intermediate -> advanced
5 advanced
6 any
我們需要在select語句中引用這些範圍。所以我執行了下列語句:
create or replace package plch_pkg
isc_beginner constant integer := 1;
c_intermediate constant integer := 2;
c_advanced constant integer := 3;
end;
/哪些選項在執行這個**塊之後:
begin
dbms_output.put_line (plch_difficulty_where_clause (6));
end;
/會導致下列文字被顯示:
difficulty_number in (1,2,3)
(a)
create or replace function plch_difficulty_where_clause (
difficulty_range_in in integer)
return varchar2
isbegin
return 'difficulty_number in ('
|| c
asedifficulty_range_in
when 1
then
plch_pkg.c_beginner
when 2
then
plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate
when 3
then
plch_pkg.c_intermediate
when 4
then
plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced
when 5
then
plch_pkg.c_advanced
when 6
then
plch_pkg.c_beginner
|| ','
|| plch_pkg.c_intermediate
|| ','
|| plch_pkg.c_advanced
end|| ')';
end;
/(b)
create or replace function plch_difficulty_where_clause (
difficulty_range_in in integer)
return varchar2
isbegin
return 'difficulty_number in ('
|| case difficulty_range_in
when 1
then
to_char (plch_pkg.c_beginner)
when 2
then
plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate
when 3
then
plch_pkg.c_intermediate
when 4
then
plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced
when 5
then
plch_pkg.c_advanced
when 6
then
plch_pkg.c_beginner
|| ','
|| plch_pkg.c_intermediate
|| ','
|| plch_pkg.c_advanced
end|| ')';
end;
/(c)
create or replace function plch_difficulty_where_clause (
difficulty_range_in in integer)
return varchar2
isbegin
return 'difficulty_number in ('
|| case difficulty_range_in
when 1
then
to_char (plch_pkg.c_beginner)
when 2
then
plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate
when 3
then
to_char (plch_pkg.c_intermediate)
when 4
then
plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced
when 5
then
to_char (plch_pkg.c_advanced)
when 6
then
plch_pkg.c_beginner
|| ','
|| plch_pkg.c_intermediate
|| ','
|| plch_pkg.c_advanced
end|| ')';
end;
/(d)
create or replace package plch_pkg
isc_beginner constant varchar2 (1) := 1;
c_intermediate constant varchar2 (1) := 2;
c_advanced constant varchar2 (1) := 3;
end;
/create or replace function plch_difficulty_where_clause (
difficulty_range_in in integer)
return varchar2
isbegin
return 'difficulty_number in ('
|| case difficulty_range_in
when 1
then
plch_pkg.c_beginner
when 2
then
plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate
when 3
then
plch_pkg.c_intermediate
when 4
then
plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced
when 5
then
plch_pkg.c_advanced
when 6
then
plch_pkg.c_beginner
|| ','
|| plch_pkg.c_intermediate
|| ','
|| plch_pkg.c_advanced
end|| ')';
end;/
ab: 這個選項會報 ora-06502 錯誤。
問題在於有些表示式(不帶拼接的那些)返回乙個整數,有些返回乙個字串(那些帶拼接的,它們依賴於隱式轉換)。
如果when子句中有任何乙個是整數,那麼pl/sql就會要求每個都是整數,因此拼接會導致錯誤——它們無法被轉換成整數。
c: 現在,when子句中每乙個整數都被顯式轉換成字串,所以case表示式可以完成而不出錯。
d: 現在,包把所有三個常量宣告為字串,因此case中的所有表示式都是相同的型別。
每日一題 反轉鍊錶
這道是牛客的題,給了鍊錶然後返回鍊錶的新表頭。拿到這道題首先肯定想到的是暴力求解,從表頭開始遍歷到尾,用尾元素作為新錶的表頭,然後遍歷尾元素的上乙個元素,鏈到新錶的最後然後不斷重複直到鍊錶的表頭鏈到新錶的尾巴 這樣有乙個很大的問題就是複雜度太高了,時間複雜度是o n n 這個時候我想到了肯定有簡單的...
每日一題 1
題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...
每日一題2018 3 21
leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...