Checking for prime number in boolean expression without defining a function - oracle
Could the following PL/SQL code be completed by providing some boolean expression for IF statement?
declare
N int := extract(year from sysdate);
begin
if INSERT_YOUR_BOOLEAN_EXPRESSION_HERE then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Obviously, you can't define your own function.
Only standard Oracle 11g PL/SQL functions are allowed.
The code should work properly during years 2014-9999.
EDIT :
Answer is accepted, but problem is not solved as it was desired.
So, let's go on.
Let's reduce time interval to just 256 years in nearest future: 2014-2269
Will you be able to find another solution, more clever and more compact, without external dependencies outside Oracle server?
It requires some bright idea to succeed in this task.
EDIT #2 :
The current record is 41 symbols long: not regexp_like(rpad(1,N,1),'^(11+)\1+$')
Now may be someone can provide even more brilliant solution?
I would be impressed enough to award one more king-size bounty ))
Beat the current record by at least 1 symbol.
Ok, here is another solution:
declare
N int := extract(year from sysdate);
begin
if not regexp_like(rpad('1', N, '1'),'^1?$|^(11+?)\1+$')
then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
It is good up to 32767 (size of varchar2 in PL/SQL)
Second Attempt - 40 characters
regexp_instr(rpad(2,N+1),'2( +)\1+$')=0
Based on #vav's answer, with a few minor changes. Replacing not regexp_like... with regexp_count...=0 saves one character. The other changes are cosmetic - replacing the character 1 with 2 to distinguish between the character and the backreference; using N+1, the default rpad parameter, and spaces just to show a slightly different way to do it. regexp_count could also work here but that function is newer than other regular expression functions.
First Attempt - 54 characters
Here is a completely impracticable solution that just so happens to use a very small number of characters for the expression (54), and in no way resembles code golf.
declare
N int := extract(year from sysdate);
begin
if httpuritype('goo.gl/qMu5eR').getClob like'% '||n||' %' then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Make it all on one screen and require no internet connection:
declare
N int := extract(year from sysdate);
begin
if case
when least(
mod(N, 2), mod(N, 3), mod(N, 5), mod(N, 7), mod(N, 11)
,mod(N, 13), mod(N, 17), mod(N, 19), mod(N, 23), mod(N, 29)
,mod(N, 31), mod(N, 37), mod(N, 41), mod(N, 43), mod(N, 47)
,mod(N, 53), mod(N, 59), mod(N, 61), mod(N, 67), mod(N, 71)
,mod(N, 73), mod(N, 79), mod(N, 83), mod(N, 89), mod(N, 97)
)
= 0 then 'NOT PRIME'
ELSE 'PRIME'
end = 'PRIME' then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Comment out last 2 lines of mods if you OK to stay under 2269.
It is scalable to a certain degree, it goes with O(sqrt(n)).
Try this:
declare
N int := extract(year from sysdate);
begin
if case
when N in
(2017, 2027, 2029, 2039, 2053,
2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129,
2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213,
2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,
2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423,
2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531,
2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617,
2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741,
2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819,
2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903,
2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181,
3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257,
3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413,
3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511,
3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571,
3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727,
3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821,
3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907,
3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057,
4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139,
4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231,
4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409,
4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493,
4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583,
4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751,
4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831,
4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937,
4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003,
5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087,
5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179,
5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279,
5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387,
5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443,
5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521,
5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639,
5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693,
5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791,
5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857,
5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939,
5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053,
6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133,
6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221,
6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301,
6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367,
6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473,
6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571,
6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673,
6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761,
6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833,
6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917,
6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997,
7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103,
7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207,
7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297,
7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411,
7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499,
7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561,
7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643,
7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723,
7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829,
7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919,
7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017,
8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111,
8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219,
8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291,
8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387,
8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501,
8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597,
8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677,
8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741,
8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831,
8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929,
8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011,
9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109,
9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199,
9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283,
9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377,
9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439,
9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533,
9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631,
9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733,
9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811,
9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887,
9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973)
then 'PRIME'
ELSE 'NOT PRIME'
end = 'PRIME' then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Share and enjoy.
declare
N int := extract(year from sysdate);
begin
if mod(n,2)<>0 and mod(n,3)<>0 and mod(n,5)<>0 and mod(n,7)<>0
and mod(n,11)<>0 and mod(n,13)<>0 and mod(n,17)<>0 and mod(n,19)<>0
and mod(n,23)<>0 and mod(n,29)<>0 and mod(n,31)<>0 and mod(n,37)<>0
and mod(n,41)<>0 and mod(n,43)<>0 and mod(n,47)<>0 then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
This works stable for the interval 2014-2269
UPD: Minimum number of comparisons i've found is:
when mod(n,10) in (1,3,7,9) and mod(n,3)<>0
and mod(n,7)<>0 and mod(n,11)<>0 and mod(n,13)<>0
and mod(n,17)<>0 and mod(n,19)<>0 and mod(n,23)<>0
and mod(n,29)<>0 and mod(n,31)<>0 and mod(n,37)<>0
and mod(n,41)<>0 and mod(n,43)<>0 and mod(n,47)<>0
Related
Oracle Forms- 'FND_MESSAGE' issue
I have created one POPUP in Oracle Forms (Custom PLL - Oracle EBS R12) fnd_message.set_name ('XX', 'CASCADE_SHIPPING_METHOD'); -- fnd_message.show; n_button_selection := fnd_message.question ('Yes', 'No', '', 1, 2, 3); IF n_button_selection = 1 THEN Procedure1(); ELSIF n_button_selection = 2 THEN Procedure2(); ELSE NULL; END IF; This code is working fine But, If the User CLOSE the form(by clicking the 'X' mark), then ELSIF condition is executed and calling the procedure2. I expect the control goes to ELSE and do nothing. Kindly help. I modified the code as fnd_message.set_name ('XX', 'CASCADE_SHIPPING_METHOD'); n_button_selection := fnd_message.question ('Yes', 'No', 'Cancel', 1, 2, 3); --If user select "Yes" option to cascade, then enter inside if and call the proc to cascade IF n_button_selection = 1 THEN MESSAGE('Pressed Yes-For Lines Cascading'); shipping_method (l_header_id, ship_method, 'Lines'); ELSIF n_button_selection = 2 THEN MESSAGE('Pressed No-For Header Cascading'); shipping_method (l_header_id, ship_method, 'Header'); ELSE MESSAGE('Inside ELSE Condition'); NULL; END IF; but still If I close the form the control Goes to Button Selection 2 that is ELSIF.
Try this: fnd_message.set_name ('XX', 'CASCADE_SHIPPING_METHOD'); -- fnd_message.show; n_button_selection := fnd_message.question ('Yes', 'No', 'Cancle', 1, 3); IF n_button_selection = 1 THEN Procedure1(); ELSIF n_button_selection = 2 THEN Procedure2(); ELSE NULL; END IF;
price in menu+total price (pascal)
My program should allow the user to choose ice cream from menu then add the price for the ice cream to show total price of the ice cream.However my output for total price is wrong. For example if i choose 1 and 2 the answer should be 1.5+1.7=3.2 but I get 3.4. Also if i choose 2 I'll only get error. Please help me. program iceCream; var count,i: integer; price:array[1..50]of real; totalPrice: real; choice: integer; begin count:= 0; writeln ( ' ICE CREAM FLAVOUR'); write ( ' 1.Vanilla: RM 1.50 | 3.Chocolate: RM 2.00'); writeln; write ( ' 2. Strawberry: RM 1.70 | 0. Exit '); writeln; repeat write ( ' Enter your choice(number): '); readln ( choice); if choice <= 3 then count:= count+1 else writeln ( 'Invalid choice'); case choice of 1: begin price[i]:= 1.50; end; 2: begin price[i]:= 1.70 ; end; 3: begin price[i]:= 2.00; end; end; for i:= 1 to count do begin totalPrice:= totalPrice+price[i]; end; until choice = 0; writeln ( ' Total ice-cream: ', count); readln; writeln ( ' Total price: RM ', totalPrice:2:2); readln; end.
I won't answer your question here. It's more important to find out what you're doing wrong and how you can solve the problem on your own. How to find out what's going wrong? The compiler shows two warnings when it compiles your code: Warnings: 2 project1.lpr(29,17) Warning: Variable "i" does not seem to be initialized project1.lpr(44,25) Warning: Variable "totalPrice" does not seem to be initialized This kind of warnings appears when you read a variable without having a value assigned to it. The compiler leads you to the location of the unsafe code. The first warning is located in line 29 in column 17: 1: begin price[i]:= 1.50; // i has not been set before. So its value is undefined or 0 end; Is your intention to use set Price[i] here? So why hasn't it been assigned to a value before? Or do you have a different variable that holds the number of ice creams? Why don't you use that? Let's take a look at the second warning in line 44 in column 25. It's this line: totalPrice:= totalPrice+price[i]; // ^ Are you sure totalPrice has been initialized correctly? Even though you initialize it correctly the program may still doesn't work properly. In that case it helps to debug the application. Open your application in the Lazarus IDE and press F8 to step through your program. You go from line to during the execution of your program. You will see what's wrong then.
case statement with in case statement
I am not sure what kind of statement I need in order for what i need to do. I would like to add a case statement after the case statement i currently have. Bellow is the case statement. CASE WHEN LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO') THEN 'GAS' WHEN LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC') THEN 'ELECTRIC' ELSE 'MISSING' END AS TYPE, I would like to say if EXT_Distworktype is GC or GT and the TYPE is ELECTRIC, GIVE ME TYPE THAT SAYS WRONG POLYGON OR IF THE EXT_DISTWORKTYPE is EC, ES, or ET and Type is GAS then give me a TYPE that say WRONG POLYGON. here is my full query: SELECT WO.WONUM AS "Work Order", WO.LOCATION AS "Location", WO.STATUS AS "Status", WO.DESCRIPTION, WO.ACTFINISH AS "Actual Finish", WO.PARENT AS "Parent WO", WO.WORKTYPE AS "Work Type", CASE WHEN WO.REPORTDATE IS NULL THEN TO_DATE('29-JAN-15 00:00:00', 'DD-MON-YY HH24:MI:SS') ELSE WO.REPORTDATE END AS "Reported Date", WO.SITEID AS "Site", CASE WHEN WO.ACTFINISH IS NULL THEN GREATEST(TRUNC(TO_DATE(SysDate, 'DD-MON-YY HH24:MI:SS') - TO_DATE(WO.REPORTDATE, 'DD-MON-YY HH24:MI:SS'), 6), 0) WHEN WO.STATUS NOT IN ('COMP') THEN GREATEST(TRUNC(TO_DATE(SysDate, 'DD-MON-YY HH24:MI:SS') - TO_DATE(WO.REPORTDATE, 'DD-MON-YY HH24:MI:SS'), 6), 0) WHEN WO.STATUS IN ('COMP') THEN GREATEST(TRUNC(TO_DATE(WO.ACTFINISH, 'DD-MON-YY HH24:MI:SS') - TO_DATE(WO.REPORTDATE, 'DD-MON-YY HH24:MI:SS'), 6), 0) END AS "Age", WO.EXT_DISTWORKTYPE, LOCOFF.EXT_OFFICE, CASE WHEN LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO') THEN 'GAS' WHEN LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC') THEN 'ELECTRIC' ELSE 'MISSING' END AS TYPE, LOCOFF.EXT_STATECODE, WO.OWNERGROUP, WO.EXT_JOBCODE FROM LOCATIONS LOCOFF RIGHT JOIN WORKORDER WO ON WO.LOCATION = LOCOFF.LOCATION WHERE WO.STATUS NOT IN ('CLOSE', 'WAIV', 'CAN', 'REJ', 'REVOKED') AND LOCOFF.SITEID = 'OPS' AND WO.EXT_JOBCODE NOT LIKE 'A%' AND WO.E`enter code here`XT_JOBCODE NOT LIKE 'B%' AND WO.EXT_JOBCODE NOT IN ('K008','K009','I006','I007','I008');
You can nest case expressions if you only want to modify the existing column value (rather than adding a separate column with the 'wrong polygon' message): CASE WHEN LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO') THEN CASE WHEN WO.EXT_DISTWORKTYPE IN ('EC', 'ES', 'ET') THEN 'WRONG POLYGON' ELSE 'GAS' END WHEN LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC') THEN CASE WHEN WO.EXT_DISTWORKTYPE IN ('GC', 'GT') THEN 'WRONG POLYGON' ELSE 'ELECTRIC' END ELSE 'MISSING' END AS TYPE, Quick SQL Fiddle demos with the same made-up data; your original case and this nested case, which gives: EXT EX TYPE --- -- ------------- BOF GC GAS CDA GT GAS SPO ES WRONG POLYGON CDC EC ELECTRIC COC ET ELECTRIC SPC GC WRONG POLYGON This is a bit simpler than trying to do a second step that interprets the TYPE value, because you can't refer to a column alias in the same level of query; you would need to make your existing query into an inline view.
Will an extra case not do it? CASE WHEN WO.EXT_DISTWORKTYPE IN ('GC', 'GT') AND LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC') --electronic THEN 'WRONG POLYGON' CASE WHEN WO.EXT_DISTWORKTYPE IN ('EC', 'ES', 'ET' ) AND LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO') --gas THEN 'WRONG POLYGON' ELSE 'MSSING' END AS YOURANSWER, You could do an case within a case CASE WHEN (TRUE) THEN CASE WHEN (true) THEN 'a' ELSE 'b' END ELSE 'A' END
Oracle calculations within Crystal report
I have this code in a Crystal report. It uses 2 fields, st.pass_total and st.fail_total to calculate the pass ratio. I'd like to replace this Crystal code with PL/SQL code to return just the pass_ratio: if isnull({st.PASS_TOTAL}) and isnull({st.FAIL_TOTAL}) then pass_ratio:="" else if (not isnull({st.PASS_TOTAL})) and isnull({st.FAIL_TOTAL}) then pass_ratio:="100%" else if (isnull({st.PASS_TOTAL}) or {st.PASS_TOTAL}=0) and (not isnull({st.FAIL_TOTAL})) then pass_ratio:="" else pass_ratio:=totext({st.PASS_TOTAL}/({st.PASS_TOTAL}+{st.FAIL_TOTAL})*100)+"%"; This is what I have in PL/SQL, is it correct? decode((is_null(st.pass_total) AND is_null(st.fail_total)), "", (not is_null(st.pass_total) AND not is_null(st.fail_total)), "100%", ((is_null(st.pass_total) OR st.pass_total=0) && not is_null(st.fail_total)), "", (st.pass_total/(st.pass_total+st.fail_total)*100)||"%")) I also have one that "calculates" the Cutoff value: if {e.eve_cutoff}=0 or isnull({e.eve_cutoff}) then event_cutoff:="140" else if {e.eve_cutoff}>0 then event_cutoff:=totext({e.eve_cutoff},0); This is what I have in PL/SQL, is it correct? decode(e.eve_cutoff, 0, "140", e.eve_cutoff, NULL, "140", eve_cutoff)
Your decode statements have several issues. This syntax can be greatly simplified by using function nvl(): select case when nvl(st.pass_total, 0) = 0 then '' else 100 * st.pass_total / (st.pass_total + nvl(st.fail_total, 0)) ||'%' end ratio from st and: select decode(nvl(eve_cutoff, 0), 0, '140', eve_cutoff) cutoff from e [SQLFiddle1] . [SQLFiddle2] For first select you may also want to round values with function round(), like I did in SQLFiddle - (if you do not do it you may get overflow error in report).
Pascal fatal error ";" expected but else founded
uses crt; var i: integer; stav: integer; prsten: boolean; begin clrscr(); stav:=0; prsten:=false; repeat case stav of 0: begin //Zacatek hry// writeln('Toto je hra, jsi Princ a jsi v lese.'); writeln('Na krizovatce muzes jit doleva = 1, nebo doprava = 2'); readln(stav); end; 1: begin writeln('Potkas draka, ktery vezni krasnou princeznu. '); writeln('3 = Prepadnout draka, 4 = Promluvit s nim'); readln(stav); end; 2: begin writeln('Potkas pocestneho. '); writeln('5 = Pokracujes dal lesem, 6 = Promluvit s pocestnym'); readln(stav); end; 3: begin writeln('Drak je silnejsi nez Ty a tak te rozprasil na popel.'); writeln('Zacni znovu stisknutim klavesy 0.'); readln(stav); end; 4: begin writeln('Drak Te vyzve na souboj, ale Ty na nej nejsi jeste pripraven.'); writeln('Musis pokracovat dal lesem. Stiskni 5.'); readln(stav); end; 5: begin writeln('Po dlouhe a namahave ceste jsi dorazil do mistni knajpy.'); writeln('Najis a napijes se a pokracujes dal. Kousek od knajpy potkas pocestneho'); writeln('Promluvis s nim. Stiskni 6.'); readln(stav); end; 6: begin writeln('Povis mu, ze se pokousis zachranit princeznu pred drakem.'); writeln('On se ti rozhodne pomoci a daruje Ti kouzelny prsten.'); writeln('Nasadit prsten na ruku a pokracovat k drakovi 7 / Strcit prsten do kapsy 8 a pokracovat k drakovi.'); readln(stav); end; 7: begin writeln('Prijdes k drakovi a das se s nim do boje.'); writeln('Draka zabijes a muzes pokracovat k princezne.'); writeln('Pokracovat k princezne, stiskni 9.'); prsten:=true; readln(stav); end; 8: begin writeln('Prijdes k drakovi a das se s nim do boje.'); writeln('Draka zabijes a muzes pokracovat k princezne.'); writeln('Pokracovat k princezne, stiskni 9.'); readln(stav); prsten:=false; end; 9: begin if prsten then writeln('Princeznu jsi uchvatil a muzes si ji odvest do hradu.'); else wrtieln('Princezna je rada, ze jsi ji zachranil, ale opovrhuje Tebou.'); readln(stav); end; end; until stav<0; writeln('KONEC'); readln; end. What is causing the fatal error ";" expected but else founded message?
Unlike C, in Pascal a semicolon ; separates statements, it does not terminate them, and the then clause requires a single statement. then WriteLn(...); else is two statements; you want then WriteLn(...) else.
Let's take this opportunity to learn how to read and use error messages to your advantage. The compiler tells you exactly what the error is (it's a ; before an else, because both of those are mentioned in the error message). It also gives you the exact line number where it's reporting the error; that's the number (usually in parentheses right before the error message, like (from Delphi): [DCC Error] Project2.dpr(14): E2153 ';' not allowed before 'ELSE' So the error is happening on line 14 (in my code - your number will be different). Let's look at that line and a few before and after: if prsten then writeln('Princeznu jsi uchvatil a muzes si ji odvest do hradu.'); else wrtieln('Princezna je rada, ze jsi ji zachranil, ale opovrhuje Tebou.'); So look at the error message: ';' not allowed before 'ELSE' That clearly tells you that the ; in the line before the else is the problem (that's very clear, because it says not allowed), so remove it. BTW, now you're going to get another error: [DCC Error] Project2.dpr(15): E2003 Undeclared identifier: 'wrtieln' I think you should be able to figure that one out; again, the compiler gives you the exact line number. You're going to get another one, if you've posted your entire code: [DCC Error] Project2.dpr(18): E2029 Statement expected but end of file found This is because you've left out the end. that marks the end of a program file in Pascal. If you've not posted your entire code, you may not get it. It's important to learn to actually read the words when you get an error message from the compiler. In most languages, the messages are clearly worded, and they all have information you can use to try to figure out (or at least narrow down) the problems in your code.