CREATE TABLE my_favorite_snacks
(
name VARCHAR2 (100),
calories INTEGER
)
Table created.
Convert Boolean to String for Display
CREATE OR REPLACE PROCEDURE my_show_boolean (val IN BOOLEAN)
IS
BEGIN
DBMS_OUTPUT.put_line (
CASE val WHEN TRUE THEN 'TRUE' WHEN FALSE THEN 'FALSE' ELSE 'NULL' END);
END my_show_boolean;
Procedure created.
Whoops! Incomplete Check...
DECLARE
CURSOR tasty_cur
IS
SELECT name, calories FROM my_favorite_snacks;
stevens_favorites tasty_cur%ROWTYPE;
vevas_favorites tasty_cur%ROWTYPE;
l_equal BOOLEAN;
BEGIN
stevens_favorites.name := 'Smoothie';
vevas_favorites.name := 'Chocolate-covered Almonds';
l_equal := stevens_favorites.calories = vevas_favorites.calories;
my_show_boolean (l_equal);
END;
NULL
Cannot check for "=" between records
DECLARE
CURSOR tasty_cur
IS
SELECT name, calories FROM my_favorite_snacks;
stevens_favorites tasty_cur%ROWTYPE;
vevas_favorites tasty_cur%ROWTYPE;
l_equal BOOLEAN;
BEGIN
stevens_favorites.name := 'Smoothie';
vevas_favorites.name := 'Chocolate-covered Almonds';
l_equal := stevens_favorites = vevas_favorites;
my_show_boolean (l_equal);
END;
ORA-06550: line 13, column 33: PLS-00306: wrong number or types of arguments in call to '=' ORA-06550: line 13, column 4: PL/SQL: Statement ignoredMore Details: https://docs.oracle.com/error-help/db/ora-06550
Verbose But Accurate Comparison
DECLARE
CURSOR tasty_cur
IS
SELECT name, calories FROM my_favorite_snacks;
stevens_favorites tasty_cur%ROWTYPE;
vevas_favorites tasty_cur%ROWTYPE;
l_equal BOOLEAN;
BEGIN
stevens_favorites.name := 'Smoothie';
vevas_favorites.name := 'Chocolate-covered Almonds';
l_equal :=
( stevens_favorites.name = vevas_favorites.name
OR ( stevens_favorites.name IS NULL
AND vevas_favorites.name IS NULL))
AND ( stevens_favorites.calories = vevas_favorites.calories
OR ( stevens_favorites.calories IS NULL
AND vevas_favorites.calories IS NULL));
my_show_boolean (l_equal);
END;
FALSE
My Favorite Solution
DECLARE
CURSOR tasty_cur
IS
SELECT name, calories FROM my_favorite_snacks;
stevens_favorites tasty_cur%ROWTYPE;
vevas_favorites tasty_cur%ROWTYPE;
l_equal BOOLEAN;
FUNCTION favorites_equal (rec1 IN my_favorite_snacks%ROWTYPE,
rec2 IN my_favorite_snacks%ROWTYPE)
RETURN BOOLEAN
IS
BEGIN
RETURN ( rec1.name = rec2.name
OR (rec1.name IS NULL AND rec2.name IS NULL))
AND ( rec1.calories = rec2.calories
OR (rec1.calories IS NULL AND rec2.calories IS NULL));
END;
BEGIN
stevens_favorites.name := 'Smoothie';
vevas_favorites.name := 'Chocolate-covered Almonds';
l_equal := favorites_equal (stevens_favorites, vevas_favorites);
my_show_boolean (l_equal);
END;
FALSE
DROP PROCEDURE my_show_boolean
Procedure dropped.
DROP TABLE my_favorite_snacks
Table dropped.