First of all, this sounds like you're trying to create a sequence of ordinals for certain rows without gaps. If that is true, it should be noted that you will have gaps if the rows are deleted. Also what happens if the price is updated to null or vice versa?
Having that said, you could do the insert using a select statement. Something like
INSERT INTO TableName
(DATE, PRICE, NON_ZERO_ID)
SELECT :datevariable
:pricevariable
CASE
WHEN :pricevariable IS NULL THEN NULL
ELSE (SELECT MAX(NON_ZERO_ID) + 1
FROM TableName)
END
FROM dual;
At the moment I don't have the possibility to check syntax so hopefully it doesn't contain mistakes...